mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-04 02:04:03 +00:00
## What changed? Remove some code duplication for cassandra matching task queue persistence by rewriting v2 to v1 queries. Switch same scheme for SQL queries to use the v2 table name in the base query and rewriting v1. Use panic instead of returning an invalid query. ## Why? Remove code duplication. ## How did you test it? - [x] covered by existing tests
172 lines
4.9 KiB
Go
172 lines
4.9 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"go.temporal.io/api/serviceerror"
|
|
"go.temporal.io/server/common/persistence/sql/sqlplugin"
|
|
)
|
|
|
|
const (
|
|
taskQueueCreatePart = `INTO task_queues_v2 (range_hash, task_queue_id, range_id, data, data_encoding) ` +
|
|
`VALUES (:range_hash, :task_queue_id, :range_id, :data, :data_encoding)`
|
|
|
|
// (default range ID: initialRangeID == 1)
|
|
createTaskQueueQry = `INSERT ` + taskQueueCreatePart
|
|
|
|
updateTaskQueueQry = `UPDATE task_queues_v2 SET
|
|
range_id = :range_id,
|
|
data = :data,
|
|
data_encoding = :data_encoding
|
|
WHERE
|
|
range_hash = :range_hash AND
|
|
task_queue_id = :task_queue_id
|
|
`
|
|
|
|
listTaskQueueRowSelect = `SELECT range_hash, task_queue_id, range_id, data, data_encoding FROM task_queues_v2 `
|
|
|
|
listTaskQueueWithHashRangeQry = listTaskQueueRowSelect +
|
|
`WHERE range_hash >= ? AND range_hash <= ? AND task_queue_id > ? ORDER BY task_queue_id ASC LIMIT ?`
|
|
|
|
listTaskQueueQry = listTaskQueueRowSelect +
|
|
`WHERE range_hash = ? AND task_queue_id > ? ORDER BY task_queue_id ASC LIMIT ?`
|
|
|
|
getTaskQueueQry = listTaskQueueRowSelect +
|
|
`WHERE range_hash = ? AND task_queue_id = ?`
|
|
|
|
deleteTaskQueueQry = `DELETE FROM task_queues_v2 WHERE range_hash=? AND task_queue_id=? AND range_id=?`
|
|
|
|
lockTaskQueueQry = `SELECT range_id FROM task_queues_v2 ` +
|
|
`WHERE range_hash = ? AND task_queue_id = ?`
|
|
)
|
|
|
|
// InsertIntoTaskQueues inserts one or more rows into task_queues[_v2] table
|
|
func (mdb *db) InsertIntoTaskQueues(
|
|
ctx context.Context,
|
|
row *sqlplugin.TaskQueuesRow,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) (sql.Result, error) {
|
|
return mdb.conn.NamedExecContext(ctx,
|
|
sqlplugin.SwitchTaskQueuesTable(createTaskQueueQry, v),
|
|
row,
|
|
)
|
|
}
|
|
|
|
// UpdateTaskQueues updates a row in task_queues[_v2] table
|
|
func (mdb *db) UpdateTaskQueues(
|
|
ctx context.Context,
|
|
row *sqlplugin.TaskQueuesRow,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) (sql.Result, error) {
|
|
return mdb.conn.NamedExecContext(ctx,
|
|
sqlplugin.SwitchTaskQueuesTable(updateTaskQueueQry, v),
|
|
row,
|
|
)
|
|
}
|
|
|
|
// SelectFromTaskQueues reads one or more rows from task_queues[_v2] table
|
|
func (mdb *db) SelectFromTaskQueues(
|
|
ctx context.Context,
|
|
filter sqlplugin.TaskQueuesFilter,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) ([]sqlplugin.TaskQueuesRow, error) {
|
|
switch {
|
|
case filter.TaskQueueID != nil:
|
|
if filter.RangeHashLessThanEqualTo != 0 || filter.RangeHashGreaterThanEqualTo != 0 {
|
|
return nil, serviceerror.NewInternal("range of hashes not supported for specific selection")
|
|
}
|
|
return mdb.selectFromTaskQueues(ctx, filter, v)
|
|
case filter.RangeHashLessThanEqualTo != 0 && filter.PageSize != nil:
|
|
if filter.RangeHashLessThanEqualTo < filter.RangeHashGreaterThanEqualTo {
|
|
return nil, serviceerror.NewInternal("range of hashes bound is invalid")
|
|
}
|
|
return mdb.rangeSelectFromTaskQueues(ctx, filter, v)
|
|
case filter.TaskQueueIDGreaterThan != nil && filter.PageSize != nil:
|
|
return mdb.rangeSelectFromTaskQueues(ctx, filter, v)
|
|
default:
|
|
return nil, serviceerror.NewInternal("invalid set of query filter params")
|
|
}
|
|
}
|
|
|
|
func (mdb *db) selectFromTaskQueues(
|
|
ctx context.Context,
|
|
filter sqlplugin.TaskQueuesFilter,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) ([]sqlplugin.TaskQueuesRow, error) {
|
|
var err error
|
|
var row sqlplugin.TaskQueuesRow
|
|
err = mdb.conn.GetContext(ctx,
|
|
&row,
|
|
sqlplugin.SwitchTaskQueuesTable(getTaskQueueQry, v),
|
|
filter.RangeHash,
|
|
filter.TaskQueueID,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return []sqlplugin.TaskQueuesRow{row}, nil
|
|
}
|
|
|
|
func (mdb *db) rangeSelectFromTaskQueues(
|
|
ctx context.Context,
|
|
filter sqlplugin.TaskQueuesFilter,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) ([]sqlplugin.TaskQueuesRow, error) {
|
|
var err error
|
|
var rows []sqlplugin.TaskQueuesRow
|
|
|
|
if filter.RangeHashLessThanEqualTo != 0 {
|
|
err = mdb.conn.SelectContext(ctx,
|
|
&rows,
|
|
sqlplugin.SwitchTaskQueuesTable(listTaskQueueWithHashRangeQry, v),
|
|
filter.RangeHashGreaterThanEqualTo,
|
|
filter.RangeHashLessThanEqualTo,
|
|
filter.TaskQueueIDGreaterThan,
|
|
*filter.PageSize,
|
|
)
|
|
} else {
|
|
err = mdb.conn.SelectContext(ctx,
|
|
&rows,
|
|
sqlplugin.SwitchTaskQueuesTable(listTaskQueueQry, v),
|
|
filter.RangeHash,
|
|
filter.TaskQueueIDGreaterThan,
|
|
*filter.PageSize,
|
|
)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return rows, nil
|
|
}
|
|
|
|
// DeleteFromTaskQueues deletes a row from task_queues[_v2] table
|
|
func (mdb *db) DeleteFromTaskQueues(
|
|
ctx context.Context,
|
|
filter sqlplugin.TaskQueuesFilter,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) (sql.Result, error) {
|
|
return mdb.conn.ExecContext(ctx,
|
|
sqlplugin.SwitchTaskQueuesTable(deleteTaskQueueQry, v),
|
|
filter.RangeHash,
|
|
filter.TaskQueueID,
|
|
*filter.RangeID,
|
|
)
|
|
}
|
|
|
|
// LockTaskQueues locks a row in task_queues[_v2] table
|
|
func (mdb *db) LockTaskQueues(
|
|
ctx context.Context,
|
|
filter sqlplugin.TaskQueuesFilter,
|
|
v sqlplugin.MatchingTaskVersion,
|
|
) (int64, error) {
|
|
var rangeID int64
|
|
err := mdb.conn.GetContext(ctx,
|
|
&rangeID,
|
|
sqlplugin.SwitchTaskQueuesTable(lockTaskQueueQry, v),
|
|
filter.RangeHash,
|
|
filter.TaskQueueID,
|
|
)
|
|
return rangeID, err
|
|
}
|