Files
tasks/common/persistence/sql/sqlplugin/visibility_query_converter_test.go
Rodrigo ZhouandGitHub 5d64c0b65f Unified query converter for Visibility (#8307)
## What changed?
Unify Visibility query converters.

The new query converter is the struct `query.QueryConverter[ExprT]`. The
generic parameter specify the output type of the converter (in ES is
`elastic.Query`, in SQL is `sqlparser.Expr`).

The query converter has a `query.StoreQueryConverter[ExprT]`. This is
the Visibility store specific implementation for building the output
query.

For example, the store needs to implement `BuildAndExpr(exprs)` to tell
the query converter how to build the `AND` expression. In SQL, it's
`*sqlparser.AndExpr{exprs}`. In Elasticsearch, it's
`elastic.NewBoolQuery().Filter(exprs)`.

The store query converter for SQL needs a plugin query converter called
`sqlplugin.VisibilityQueryConverter` which is implemented by each plugin
(MySQL, PostgreSQL, SQLite). This interface is needed to build DB
specific syntax for `KeywordList` and `Text` searches as well as to
build the final `SELECT` statements.

Added dynamic config `system.VisibilityEnableUnifiedQueryConverter` that
acts as switch between the legacy and the unified query converters.

## Why?
There are two query converters: one for Elasticsearch, and another for
SQL.
They are somewhat similar, and have quite a few code duplications for
validation, modifying the query, etc.
Unifying the query converter ensures that we provide the exact same
behavior across different Visibility stores.

## How did you test it?
- [x] built
- [x] run locally and tested manually
- [x] covered by existing tests
- [x] added new unit test(s)
- [ ] added new functional test(s)

I've added a lot of unit tests for the new code with coverage close to
100%.

Note that there has been basically no changes to functional tests, which
suggests that the change works well.

## Potential risks
There might be some edge cases that either query converters that this
unified query converter might deal differently.
2025-11-11 01:48:34 +00:00

51 lines
1.2 KiB
Go

package sqlplugin
import (
"testing"
"time"
"github.com/stretchr/testify/require"
)
func TestSerializeVisibilityPageToken(t *testing.T) {
r := require.New(t)
token := VisibilityPageToken{
CloseTime: time.Date(2023, 3, 21, 14, 20, 32, 0, time.UTC),
StartTime: time.Date(2023, 3, 21, 14, 10, 32, 0, time.UTC),
RunID: "test-run-id",
}
data, err := SerializeVisibilityPageToken(&token)
r.NoError(err)
r.JSONEq(
`{"CloseTime":"2023-03-21T14:20:32Z","StartTime":"2023-03-21T14:10:32Z","RunID":"test-run-id"}`,
string(data),
)
}
func TestDeserializeVisibilityPageToken(t *testing.T) {
r := require.New(t)
token, err := DeserializeVisibilityPageToken(nil)
r.NoError(err)
r.Nil(token)
token, err = DeserializeVisibilityPageToken([]byte{})
r.NoError(err)
r.Nil(token)
token, err = DeserializeVisibilityPageToken(
[]byte(`{"CloseTime":"2023-03-21T14:20:32Z","StartTime":"2023-03-21T14:10:32Z","RunID":"test-run-id"}`),
)
r.NoError(err)
r.NotNil(token)
r.Equal(
VisibilityPageToken{
CloseTime: time.Date(2023, 3, 21, 14, 20, 32, 0, time.UTC),
StartTime: time.Date(2023, 3, 21, 14, 10, 32, 0, time.UTC),
RunID: "test-run-id",
},
*token,
)
}