mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-04 02:04:03 +00:00
Rename current Visibility query converter with 'legacy' suffix (#8333)
## What changed? Rename current Visibility query converter with 'legacy' suffix ## Why? Preparation for the unified query converter that will replace the legacy one. ## How did you test it? - [x] built - [ ] run locally and tested manually - [x] covered by existing tests - [ ] added new unit test(s) - [ ] added new functional test(s) ## Potential risks
This commit is contained in:
@@ -171,8 +171,8 @@ func NewRefCountedDBConn(
|
||||
}
|
||||
}
|
||||
|
||||
// Get returns a mysql db connection and increments a reference count
|
||||
// this method will create a new connection, if an existing connection
|
||||
// Get returns a db connection and increments a reference count.
|
||||
// This method will create a new connection, if an existing connection
|
||||
// does not exist
|
||||
func (c *DbConn) Get() (sqlplugin.DB, error) {
|
||||
c.Lock()
|
||||
|
||||
@@ -19,11 +19,11 @@ var allowedComparisonOperators = map[string]struct{}{
|
||||
sqlparser.NotStartsWithStr: {},
|
||||
}
|
||||
|
||||
func NewQueryConverter(
|
||||
func NewQueryConverterLegacy(
|
||||
fnInterceptor query.FieldNameInterceptor,
|
||||
fvInterceptor query.FieldValuesInterceptor,
|
||||
saNameType searchattribute.NameTypeMap,
|
||||
) *query.Converter {
|
||||
) *query.ConverterLegacy {
|
||||
if fnInterceptor == nil {
|
||||
fnInterceptor = &query.NopFieldNameInterceptor{}
|
||||
}
|
||||
@@ -44,5 +44,5 @@ func NewQueryConverter(
|
||||
whereConverter.And = query.NewAndConverter(whereConverter)
|
||||
whereConverter.Or = query.NewOrConverter(whereConverter)
|
||||
|
||||
return query.NewConverter(fnInterceptor, whereConverter)
|
||||
return query.NewConverterLegacy(fnInterceptor, whereConverter)
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ var testNameTypeMap = searchattribute.NewNameTypeMapStub(
|
||||
)
|
||||
|
||||
func TestSupportedSelectWhere(t *testing.T) {
|
||||
c := NewQueryConverter(nil, nil, testNameTypeMap)
|
||||
c := NewQueryConverterLegacy(nil, nil, testNameTypeMap)
|
||||
|
||||
for sql, expectedJson := range supportedWhereCases {
|
||||
queryParams, err := c.ConvertWhereOrderBy(sql)
|
||||
@@ -140,7 +140,7 @@ func TestSupportedSelectWhere(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestEmptySelectWhere(t *testing.T) {
|
||||
c := NewQueryConverter(nil, nil, testNameTypeMap)
|
||||
c := NewQueryConverterLegacy(nil, nil, testNameTypeMap)
|
||||
|
||||
queryParams, err := c.ConvertWhereOrderBy("")
|
||||
assert.NoError(t, err)
|
||||
@@ -157,7 +157,7 @@ func TestEmptySelectWhere(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSupportedSelectWhereOrder(t *testing.T) {
|
||||
c := NewQueryConverter(nil, nil, testNameTypeMap)
|
||||
c := NewQueryConverterLegacy(nil, nil, testNameTypeMap)
|
||||
|
||||
for sql, expectedJson := range supportedWhereOrderCases {
|
||||
queryParams, err := c.ConvertWhereOrderBy(sql)
|
||||
@@ -178,7 +178,7 @@ func TestSupportedSelectWhereOrder(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSupportedSelectWhereGroupBy(t *testing.T) {
|
||||
c := NewQueryConverter(nil, nil, testNameTypeMap)
|
||||
c := NewQueryConverterLegacy(nil, nil, testNameTypeMap)
|
||||
|
||||
for sql, expectedJson := range supportedWhereGroupByCases {
|
||||
queryParams, err := c.ConvertWhereOrderBy(sql)
|
||||
@@ -196,7 +196,7 @@ func TestSupportedSelectWhereGroupBy(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestErrors(t *testing.T) {
|
||||
c := NewQueryConverter(nil, nil, testNameTypeMap)
|
||||
c := NewQueryConverterLegacy(nil, nil, testNameTypeMap)
|
||||
for sql, expectedErrMessage := range errorCases {
|
||||
_, err := c.ConvertSql(sql)
|
||||
assert.Contains(t, err.Error(), expectedErrMessage, sql)
|
||||
|
||||
@@ -363,7 +363,7 @@ func (s *VisibilityStore) CountWorkflowExecutions(
|
||||
ctx context.Context,
|
||||
request *manager.CountWorkflowExecutionsRequest,
|
||||
) (*manager.CountWorkflowExecutionsResponse, error) {
|
||||
queryParams, err := s.convertQuery(request.Namespace, request.NamespaceID, request.Query)
|
||||
queryParams, err := s.convertQueryLegacy(request.Namespace, request.NamespaceID, request.Query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -383,7 +383,7 @@ func (s *VisibilityStore) CountWorkflowExecutions(
|
||||
|
||||
func (s *VisibilityStore) countGroupByWorkflowExecutions(
|
||||
ctx context.Context,
|
||||
queryParams *query.QueryParams,
|
||||
queryParams *query.QueryParamsLegacy,
|
||||
) (*manager.CountWorkflowExecutionsResponse, error) {
|
||||
groupByFields := queryParams.GroupBy
|
||||
|
||||
@@ -461,7 +461,7 @@ func (s *VisibilityStore) BuildSearchParametersV2(
|
||||
request *manager.ListWorkflowExecutionsRequestV2,
|
||||
getFieldSorter func([]elastic.Sorter) ([]elastic.Sorter, error),
|
||||
) (*client.SearchParameters, error) {
|
||||
queryParams, err := s.convertQuery(
|
||||
queryParams, err := s.convertQueryLegacy(
|
||||
request.Namespace,
|
||||
request.NamespaceID,
|
||||
request.Query,
|
||||
@@ -562,17 +562,17 @@ func (s *VisibilityStore) processPageToken(
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *VisibilityStore) convertQuery(
|
||||
func (s *VisibilityStore) convertQueryLegacy(
|
||||
namespace namespace.Name,
|
||||
namespaceID namespace.ID,
|
||||
requestQueryStr string,
|
||||
) (*query.QueryParams, error) {
|
||||
) (*query.QueryParamsLegacy, error) {
|
||||
saTypeMap, err := s.searchAttributesProvider.GetSearchAttributes(s.index, false)
|
||||
if err != nil {
|
||||
return nil, serviceerror.NewUnavailablef("unable to read search attribute types: %v", err)
|
||||
}
|
||||
nameInterceptor := NewNameInterceptor(namespace, saTypeMap, s.searchAttributesMapperProvider)
|
||||
queryConverter := NewQueryConverter(
|
||||
queryConverter := NewQueryConverterLegacy(
|
||||
nameInterceptor,
|
||||
NewValuesInterceptor(namespace, saTypeMap),
|
||||
saTypeMap,
|
||||
|
||||
@@ -279,194 +279,195 @@ func (s *ESVisibilitySuite) sorterToJSON(sorters []elastic.Sorter) string {
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func (s *ESVisibilitySuite) Test_convertQuery() {
|
||||
func (s *ESVisibilitySuite) Test_convertQueryLegacy() {
|
||||
query := `WorkflowId = 'wid'`
|
||||
queryParams, err := s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err := s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"WorkflowId":"wid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `WorkflowId = 'wid' or WorkflowId = 'another-wid'`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"should":[{"term":{"WorkflowId":"wid"}},{"term":{"WorkflowId":"another-wid"}}]}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `WorkflowId = 'wid' order by StartTime desc`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"WorkflowId":"wid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"StartTime":{"order":"desc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `WorkflowId = 'wid' and CloseTime is null`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":[{"term":{"WorkflowId":"wid"}},{"bool":{"must_not":{"exists":{"field":"CloseTime"}}}}]}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `WorkflowId = 'wid' or CloseTime is null`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"should":[{"term":{"WorkflowId":"wid"}},{"bool":{"must_not":{"exists":{"field":"CloseTime"}}}}]}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `CloseTime is null order by CloseTime desc`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"must_not":{"exists":{"field":"CloseTime"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"CloseTime":{"order":"desc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `StartTime = "2018-06-07T15:04:05.123456789-08:00"`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"match":{"StartTime":{"query":"2018-06-07T15:04:05.123456789-08:00"}}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `WorkflowId = 'wid' and StartTime > "2018-06-07T15:04:05+00:00"`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":[{"term":{"WorkflowId":"wid"}},{"range":{"StartTime":{"from":"2018-06-07T15:04:05+00:00","include_lower":false,"include_upper":true,"to":null}}}]}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `ExecutionTime < 1000000`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"range":{"ExecutionTime":{"from":null,"include_lower":true,"include_upper":false,"to":"1970-01-01T00:00:00.001Z"}}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `ExecutionTime between 1 and 2`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"range":{"ExecutionTime":{"from":"1970-01-01T00:00:00.000000001Z","include_lower":true,"include_upper":true,"to":"1970-01-01T00:00:00.000000002Z"}}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `ExecutionTime < 1000000 or ExecutionTime > 2000000`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"should":[{"range":{"ExecutionTime":{"from":null,"include_lower":true,"include_upper":false,"to":"1970-01-01T00:00:00.001Z"}}},{"range":{"ExecutionTime":{"from":"1970-01-01T00:00:00.002Z","include_lower":false,"include_upper":true,"to":null}}}]}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `order by ExecutionTime`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"ExecutionTime":{"order":"asc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `order by StartTime desc, CloseTime asc`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"StartTime":{"order":"desc"}},{"CloseTime":{"order":"asc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `order by CustomTextField desc`
|
||||
_, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
_, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.Error(err)
|
||||
s.IsType(&serviceerror.InvalidArgument{}, err)
|
||||
s.Equal(err.(*serviceerror.InvalidArgument).Error(), "invalid query: unable to convert 'order by' column name: unable to sort by field of Text type, use field of type Keyword")
|
||||
|
||||
query = `order by CustomIntField asc`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"CustomIntField":{"order":"asc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `ExecutionTime < "unable to parse"`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.Error(err)
|
||||
s.IsType(&serviceerror.InvalidArgument{}, err)
|
||||
s.Equal(err.Error(), "invalid query: unable to convert filter expression: unable to convert values of comparison expression: invalid value for search attribute ExecutionTime of type Datetime: \"unable to parse\"")
|
||||
s.Nil(queryParams)
|
||||
|
||||
// invalid union injection
|
||||
query = `WorkflowId = 'wid' union select * from dummy`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.Error(err)
|
||||
s.Nil(queryParams)
|
||||
}
|
||||
|
||||
func (s *ESVisibilitySuite) Test_convertQuery_Mapper() {
|
||||
func (s *ESVisibilitySuite) Test_convertQueryLegacy_Mapper() {
|
||||
s.mockSearchAttributesMapperProvider.EXPECT().GetMapper(testNamespace).
|
||||
Return(&searchattribute.TestMapper{}, nil).AnyTimes()
|
||||
|
||||
s.visibilityStore.searchAttributesMapperProvider = s.mockSearchAttributesMapperProvider
|
||||
|
||||
query := `WorkflowId = 'wid'`
|
||||
queryParams, err := s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err := s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"WorkflowId":"wid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = "`AliasForCustomKeywordField` = 'pid'"
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"CustomKeywordField":"pid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = "`AliasWithHyphenFor-CustomKeywordField` = 'pid'"
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"CustomKeywordField":"pid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `CustomKeywordField = 'pid'`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.JSONEq(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"CustomKeywordField":"pid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `AliasForUnknownField = 'pid'`
|
||||
_, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
_, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.Error(err)
|
||||
var invalidArgumentErr *serviceerror.InvalidArgument
|
||||
s.ErrorAs(err, &invalidArgumentErr)
|
||||
s.EqualError(err, "invalid query: unable to convert filter expression: unable to convert left side of \"AliasForUnknownField = 'pid'\": invalid search attribute: AliasForUnknownField")
|
||||
|
||||
query = `order by ExecutionTime`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"ExecutionTime":{"order":"asc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `order by AliasForCustomKeywordField asc`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"CustomKeywordField":{"order":"asc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
|
||||
query = `order by CustomKeywordField asc`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.JSONEq(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.NotNil(queryParams.Sorter)
|
||||
|
||||
query = `order by AliasForUnknownField asc`
|
||||
_, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
_, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.Error(err)
|
||||
s.ErrorAs(err, &invalidArgumentErr)
|
||||
s.EqualError(err, "invalid query: unable to convert 'order by' column name: invalid search attribute: AliasForUnknownField")
|
||||
s.visibilityStore.searchAttributesMapperProvider = nil
|
||||
}
|
||||
|
||||
func (s *ESVisibilitySuite) Test_convertQuery_Mapper_Error() {
|
||||
func (s *ESVisibilitySuite) Test_convertQueryLegacy_Mapper_Error() {
|
||||
s.mockSearchAttributesMapperProvider.EXPECT().GetMapper(testNamespace).
|
||||
Return(&searchattribute.TestMapper{}, nil).AnyTimes()
|
||||
|
||||
s.visibilityStore.searchAttributesMapperProvider = s.mockSearchAttributesMapperProvider
|
||||
|
||||
query := `WorkflowId = 'wid'`
|
||||
queryParams, err := s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err := s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":[{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},{"bool":{"filter":{"term":{"WorkflowId":"wid"}}}}],"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Nil(queryParams.Sorter)
|
||||
|
||||
query = `ProductId = 'pid'`
|
||||
_, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
_, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.Error(err)
|
||||
var invalidArgumentErr *serviceerror.InvalidArgument
|
||||
s.ErrorAs(err, &invalidArgumentErr)
|
||||
s.EqualError(err, "invalid query: unable to convert filter expression: unable to convert left side of \"ProductId = 'pid'\": invalid search attribute: ProductId")
|
||||
|
||||
query = `order by ExecutionTime`
|
||||
queryParams, err = s.visibilityStore.convertQuery(testNamespace, testNamespaceID, query)
|
||||
queryParams, err = s.visibilityStore.convertQueryLegacy(testNamespace, testNamespaceID, query)
|
||||
s.NoError(err)
|
||||
s.Equal(`{"bool":{"filter":{"term":{"NamespaceId":"bfd5c907-f899-4baf-a7b2-2ab85e623ebd"}},"must_not":{"exists":{"field":"TemporalNamespaceDivision"}}}}`, s.queryToJSON(queryParams.Query))
|
||||
s.Equal(`[{"ExecutionTime":{"order":"asc"}}]`, s.sorterToJSON(queryParams.Sorter))
|
||||
@@ -1182,7 +1183,7 @@ func (s *ESVisibilitySuite) TestCountGroupByWorkflowExecutions() {
|
||||
|
||||
for _, tc := range testCases {
|
||||
s.T().Run(tc.name, func(t *testing.T) {
|
||||
searchParams := &query.QueryParams{
|
||||
searchParams := &query.QueryParamsLegacy{
|
||||
Query: elastic.NewBoolQuery().
|
||||
Filter(elastic.NewTermQuery(searchattribute.NamespaceID, testNamespaceID.String())).
|
||||
MustNot(namespaceDivisionExists),
|
||||
|
||||
+11
-8
@@ -18,7 +18,7 @@ type (
|
||||
Convert(expr sqlparser.Expr) (elastic.Query, error)
|
||||
}
|
||||
|
||||
Converter struct {
|
||||
ConverterLegacy struct {
|
||||
fnInterceptor FieldNameInterceptor
|
||||
whereConverter ExprConverter
|
||||
}
|
||||
@@ -58,18 +58,18 @@ type (
|
||||
|
||||
notSupportedExprConverter struct{}
|
||||
|
||||
QueryParams struct {
|
||||
QueryParamsLegacy struct {
|
||||
Query elastic.Query
|
||||
Sorter []elastic.Sorter
|
||||
GroupBy []string
|
||||
}
|
||||
)
|
||||
|
||||
func NewConverter(fnInterceptor FieldNameInterceptor, whereConverter ExprConverter) *Converter {
|
||||
func NewConverterLegacy(fnInterceptor FieldNameInterceptor, whereConverter ExprConverter) *ConverterLegacy {
|
||||
if fnInterceptor == nil {
|
||||
fnInterceptor = &NopFieldNameInterceptor{}
|
||||
}
|
||||
return &Converter{
|
||||
return &ConverterLegacy{
|
||||
fnInterceptor: fnInterceptor,
|
||||
whereConverter: whereConverter,
|
||||
}
|
||||
@@ -172,7 +172,7 @@ func NewNotSupportedExprConverter() ExprConverter {
|
||||
|
||||
// ConvertWhereOrderBy transforms WHERE SQL statement to Elasticsearch query.
|
||||
// It also supports ORDER BY clause.
|
||||
func (c *Converter) ConvertWhereOrderBy(whereOrderBy string) (*QueryParams, error) {
|
||||
func (c *ConverterLegacy) ConvertWhereOrderBy(whereOrderBy string) (*QueryParamsLegacy, error) {
|
||||
whereOrderBy = strings.TrimSpace(whereOrderBy)
|
||||
|
||||
if whereOrderBy != "" &&
|
||||
@@ -186,7 +186,9 @@ func (c *Converter) ConvertWhereOrderBy(whereOrderBy string) (*QueryParams, erro
|
||||
}
|
||||
|
||||
// ConvertSql transforms SQL to Elasticsearch query.
|
||||
func (c *Converter) ConvertSql(sql string) (*QueryParams, error) {
|
||||
//
|
||||
//nolint:staticcheck
|
||||
func (c *ConverterLegacy) ConvertSql(sql string) (*QueryParamsLegacy, error) {
|
||||
stmt, err := sqlparser.Parse(sql)
|
||||
if err != nil {
|
||||
return nil, NewConverterError("%s: %v", MalformedSqlQueryErrMessage, err)
|
||||
@@ -200,12 +202,12 @@ func (c *Converter) ConvertSql(sql string) (*QueryParams, error) {
|
||||
return c.convertSelect(selectStmt)
|
||||
}
|
||||
|
||||
func (c *Converter) convertSelect(sel *sqlparser.Select) (*QueryParams, error) {
|
||||
func (c *ConverterLegacy) convertSelect(sel *sqlparser.Select) (*QueryParamsLegacy, error) {
|
||||
if sel.Limit != nil {
|
||||
return nil, NewConverterError("%s: 'limit' clause", NotSupportedErrMessage)
|
||||
}
|
||||
|
||||
queryParams := &QueryParams{}
|
||||
queryParams := &QueryParamsLegacy{}
|
||||
if sel.Where != nil {
|
||||
query, err := c.whereConverter.Convert(sel.Where.Expr)
|
||||
if err != nil {
|
||||
@@ -455,6 +457,7 @@ func (c *comparisonExprConverter) Convert(expr sqlparser.Expr) (elastic.Query, e
|
||||
}
|
||||
|
||||
var query elastic.Query
|
||||
//nolint:revive // missing default case
|
||||
switch comparisonExpr.Operator {
|
||||
case sqlparser.GreaterEqualStr:
|
||||
query = elastic.NewRangeQuery(colName).Gte(colValues[0])
|
||||
+5
-2
@@ -50,6 +50,7 @@ func TestNameInterceptor(t *testing.T) {
|
||||
queryParams, err := c.ConvertWhereOrderBy("ExecutionStatus='Running' order by StartTime")
|
||||
assert.NoError(t, err)
|
||||
actualQueryMap, _ := queryParams.Query.Source()
|
||||
//nolint:staticcheck
|
||||
actualQueryJson, _ := json.Marshal(actualQueryMap)
|
||||
assert.Equal(t, `{"bool":{"filter":{"term":{"ExecutionStatus1":"Running"}}}}`, string(actualQueryJson))
|
||||
var actualSorterMaps []interface{}
|
||||
@@ -57,6 +58,7 @@ func TestNameInterceptor(t *testing.T) {
|
||||
actualSorterMap, _ := sorter.Source()
|
||||
actualSorterMaps = append(actualSorterMaps, actualSorterMap)
|
||||
}
|
||||
//nolint:staticcheck
|
||||
actualSorterJson, _ := json.Marshal(actualSorterMaps)
|
||||
assert.Equal(t, `[{"StartTime1":{"order":"asc"}}]`, string(actualSorterJson))
|
||||
|
||||
@@ -70,6 +72,7 @@ func TestValuesInterceptor(t *testing.T) {
|
||||
queryParams, err := c.ConvertWhereOrderBy("ExecutionStatus=1")
|
||||
assert.NoError(t, err)
|
||||
actualQueryMap, _ := queryParams.Query.Source()
|
||||
//nolint:staticcheck
|
||||
actualQueryJson, _ := json.Marshal(actualQueryMap)
|
||||
assert.Equal(t, `{"bool":{"filter":{"term":{"ExecutionStatus":"Status1"}}}}`, string(actualQueryJson))
|
||||
|
||||
@@ -90,7 +93,7 @@ func TestValuesInterceptor(t *testing.T) {
|
||||
assert.Contains(t, err.Error(), "interceptor error")
|
||||
}
|
||||
|
||||
func getTestConverter(fnInterceptor FieldNameInterceptor, fvInterceptor FieldValuesInterceptor) *Converter {
|
||||
func getTestConverter(fnInterceptor FieldNameInterceptor, fvInterceptor FieldValuesInterceptor) *ConverterLegacy {
|
||||
testNameTypeMap := searchattribute.NewNameTypeMapStub(
|
||||
map[string]enumspb.IndexedValueType{
|
||||
"ExecutionStatus1": enumspb.INDEXED_VALUE_TYPE_KEYWORD,
|
||||
@@ -103,5 +106,5 @@ func getTestConverter(fnInterceptor FieldNameInterceptor, fvInterceptor FieldVal
|
||||
NewRangeCondConverter(fnInterceptor, fvInterceptor, false),
|
||||
NewComparisonExprConverter(fnInterceptor, fvInterceptor, map[string]struct{}{sqlparser.EqualStr: {}, sqlparser.InStr: {}}, testNameTypeMap),
|
||||
nil)
|
||||
return NewConverter(fnInterceptor, whereConverter)
|
||||
return NewConverterLegacy(fnInterceptor, whereConverter)
|
||||
}
|
||||
+4
-4
@@ -6,23 +6,23 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
pageToken struct {
|
||||
pageTokenLegacy struct {
|
||||
CloseTime time.Time
|
||||
StartTime time.Time
|
||||
RunID string
|
||||
}
|
||||
)
|
||||
|
||||
func deserializePageToken(data []byte) (*pageToken, error) {
|
||||
func deserializePageTokenLegacy(data []byte) (*pageTokenLegacy, error) {
|
||||
if len(data) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
var token *pageToken
|
||||
var token *pageTokenLegacy
|
||||
err := json.Unmarshal(data, &token)
|
||||
return token, err
|
||||
}
|
||||
|
||||
func serializePageToken(token *pageToken) ([]byte, error) {
|
||||
func serializePageTokenLegacy(token *pageTokenLegacy) ([]byte, error) {
|
||||
data, err := json.Marshal(token)
|
||||
return data, err
|
||||
}
|
||||
+6
-6
@@ -10,12 +10,12 @@ import (
|
||||
func TestSerializePageToken(t *testing.T) {
|
||||
s := assert.New(t)
|
||||
|
||||
token := pageToken{
|
||||
token := pageTokenLegacy{
|
||||
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 := serializePageToken(&token)
|
||||
data, err := serializePageTokenLegacy(&token)
|
||||
s.NoError(err)
|
||||
s.Equal(
|
||||
[]byte(`{"CloseTime":"2023-03-21T14:20:32Z","StartTime":"2023-03-21T14:10:32Z","RunID":"test-run-id"}`),
|
||||
@@ -26,21 +26,21 @@ func TestSerializePageToken(t *testing.T) {
|
||||
func TestDeserializePageToken(t *testing.T) {
|
||||
s := assert.New(t)
|
||||
|
||||
token, err := deserializePageToken(nil)
|
||||
token, err := deserializePageTokenLegacy(nil)
|
||||
s.NoError(err)
|
||||
s.Nil(token)
|
||||
|
||||
token, err = deserializePageToken([]byte{})
|
||||
token, err = deserializePageTokenLegacy([]byte{})
|
||||
s.NoError(err)
|
||||
s.Nil(token)
|
||||
|
||||
token, err = deserializePageToken(
|
||||
token, err = deserializePageTokenLegacy(
|
||||
[]byte(`{"CloseTime":"2023-03-21T14:20:32Z","StartTime":"2023-03-21T14:10:32Z","RunID":"test-run-id"}`),
|
||||
)
|
||||
s.NoError(err)
|
||||
s.NotNil(token)
|
||||
s.Equal(
|
||||
pageToken{
|
||||
pageTokenLegacy{
|
||||
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",
|
||||
+34
-29
@@ -18,7 +18,7 @@ import (
|
||||
)
|
||||
|
||||
type (
|
||||
pluginQueryConverter interface {
|
||||
pluginQueryConverterLegacy interface {
|
||||
convertKeywordListComparisonExpr(expr *sqlparser.ComparisonExpr) (sqlparser.Expr, error)
|
||||
|
||||
convertTextComparisonExpr(expr *sqlparser.ComparisonExpr) (sqlparser.Expr, error)
|
||||
@@ -27,7 +27,7 @@ type (
|
||||
namespaceID namespace.ID,
|
||||
queryString string,
|
||||
pageSize int,
|
||||
token *pageToken,
|
||||
token *pageTokenLegacy,
|
||||
) (string, []any)
|
||||
|
||||
buildCountStmt(namespaceID namespace.ID, queryString string, groupBy []string) (string, []any)
|
||||
@@ -37,8 +37,8 @@ type (
|
||||
getCoalesceCloseTimeExpr() sqlparser.Expr
|
||||
}
|
||||
|
||||
QueryConverter struct {
|
||||
pluginQueryConverter
|
||||
QueryConverterLegacy struct {
|
||||
pluginQueryConverterLegacy
|
||||
namespaceName namespace.Name
|
||||
namespaceID namespace.ID
|
||||
saTypeMap searchattribute.NameTypeMap
|
||||
@@ -48,7 +48,7 @@ type (
|
||||
seenNamespaceDivision bool
|
||||
}
|
||||
|
||||
queryParams struct {
|
||||
queryParamsLegacy struct {
|
||||
queryString string
|
||||
// List of search attributes to group by (field name, not db name).
|
||||
groupBy []string
|
||||
@@ -112,30 +112,30 @@ var (
|
||||
)
|
||||
|
||||
func newQueryConverterInternal(
|
||||
pqc pluginQueryConverter,
|
||||
pqc pluginQueryConverterLegacy,
|
||||
namespaceName namespace.Name,
|
||||
namespaceID namespace.ID,
|
||||
saTypeMap searchattribute.NameTypeMap,
|
||||
saMapper searchattribute.Mapper,
|
||||
queryString string,
|
||||
) *QueryConverter {
|
||||
return &QueryConverter{
|
||||
pluginQueryConverter: pqc,
|
||||
namespaceName: namespaceName,
|
||||
namespaceID: namespaceID,
|
||||
saTypeMap: saTypeMap,
|
||||
saMapper: saMapper,
|
||||
queryString: queryString,
|
||||
) *QueryConverterLegacy {
|
||||
return &QueryConverterLegacy{
|
||||
pluginQueryConverterLegacy: pqc,
|
||||
namespaceName: namespaceName,
|
||||
namespaceID: namespaceID,
|
||||
saTypeMap: saTypeMap,
|
||||
saMapper: saMapper,
|
||||
queryString: queryString,
|
||||
|
||||
seenNamespaceDivision: false,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *QueryConverter) BuildSelectStmt(
|
||||
func (c *QueryConverterLegacy) BuildSelectStmt(
|
||||
pageSize int,
|
||||
nextPageToken []byte,
|
||||
) (*sqlplugin.VisibilitySelectFilter, error) {
|
||||
token, err := deserializePageToken(nextPageToken)
|
||||
token, err := deserializePageTokenLegacy(nextPageToken)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -155,11 +155,12 @@ func (c *QueryConverter) BuildSelectStmt(
|
||||
return &sqlplugin.VisibilitySelectFilter{Query: queryString, QueryArgs: queryArgs}, nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) BuildCountStmt() (*sqlplugin.VisibilitySelectFilter, error) {
|
||||
func (c *QueryConverterLegacy) BuildCountStmt() (*sqlplugin.VisibilitySelectFilter, error) {
|
||||
qp, err := c.convertWhereString(c.queryString)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
//nolint:staticcheck
|
||||
groupByDbNames := make([]string, len(qp.groupBy))
|
||||
for i, fieldName := range qp.groupBy {
|
||||
groupByDbNames[i] = searchattribute.GetSqlDbColName(fieldName)
|
||||
@@ -172,7 +173,7 @@ func (c *QueryConverter) BuildCountStmt() (*sqlplugin.VisibilitySelectFilter, er
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertWhereString(queryString string) (*queryParams, error) {
|
||||
func (c *QueryConverterLegacy) convertWhereString(queryString string) (*queryParamsLegacy, error) {
|
||||
where := strings.TrimSpace(queryString)
|
||||
if where != "" &&
|
||||
!strings.HasPrefix(strings.ToLower(where), "order by") &&
|
||||
@@ -186,25 +187,27 @@ func (c *QueryConverter) convertWhereString(queryString string) (*queryParams, e
|
||||
return nil, query.NewConverterError("%s: %v", query.MalformedSqlQueryErrMessage, err)
|
||||
}
|
||||
|
||||
//nolint:revive
|
||||
selectStmt, _ := stmt.(*sqlparser.Select)
|
||||
err = c.convertSelectStmt(selectStmt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res := &queryParams{}
|
||||
res := &queryParamsLegacy{}
|
||||
if selectStmt.Where != nil {
|
||||
res.queryString = sqlparser.String(selectStmt.Where.Expr)
|
||||
}
|
||||
for _, groupByExpr := range selectStmt.GroupBy {
|
||||
// The parser already ensures the type is saColName.
|
||||
//nolint:revive
|
||||
colName := groupByExpr.(*saColName)
|
||||
res.groupBy = append(res.groupBy, colName.fieldName)
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertSelectStmt(sel *sqlparser.Select) error {
|
||||
func (c *QueryConverterLegacy) convertSelectStmt(sel *sqlparser.Select) error {
|
||||
if sel.OrderBy != nil {
|
||||
return query.NewConverterError("%s: 'order by' clause", query.NotSupportedErrMessage)
|
||||
}
|
||||
@@ -281,7 +284,7 @@ func (c *QueryConverter) convertSelectStmt(sel *sqlparser.Select) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertWhereExpr(expr *sqlparser.Expr) error {
|
||||
func (c *QueryConverterLegacy) convertWhereExpr(expr *sqlparser.Expr) error {
|
||||
if expr == nil || *expr == nil {
|
||||
return errors.New("cannot be nil")
|
||||
}
|
||||
@@ -310,7 +313,7 @@ func (c *QueryConverter) convertWhereExpr(expr *sqlparser.Expr) error {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertAndExpr(exprRef *sqlparser.Expr) error {
|
||||
func (c *QueryConverterLegacy) convertAndExpr(exprRef *sqlparser.Expr) error {
|
||||
expr, ok := (*exprRef).(*sqlparser.AndExpr)
|
||||
if !ok {
|
||||
return query.NewConverterError("`%s` is not an 'AND' expression", sqlparser.String(*exprRef))
|
||||
@@ -322,7 +325,7 @@ func (c *QueryConverter) convertAndExpr(exprRef *sqlparser.Expr) error {
|
||||
return c.convertWhereExpr(&expr.Right)
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertOrExpr(exprRef *sqlparser.Expr) error {
|
||||
func (c *QueryConverterLegacy) convertOrExpr(exprRef *sqlparser.Expr) error {
|
||||
expr, ok := (*exprRef).(*sqlparser.OrExpr)
|
||||
if !ok {
|
||||
return query.NewConverterError("`%s` is not an 'OR' expression", sqlparser.String(*exprRef))
|
||||
@@ -334,7 +337,7 @@ func (c *QueryConverter) convertOrExpr(exprRef *sqlparser.Expr) error {
|
||||
return c.convertWhereExpr(&expr.Right)
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertComparisonExpr(exprRef *sqlparser.Expr) error {
|
||||
func (c *QueryConverterLegacy) convertComparisonExpr(exprRef *sqlparser.Expr) error {
|
||||
expr, ok := (*exprRef).(*sqlparser.ComparisonExpr)
|
||||
if !ok {
|
||||
return query.NewConverterError(
|
||||
@@ -362,6 +365,7 @@ func (c *QueryConverter) convertComparisonExpr(exprRef *sqlparser.Expr) error {
|
||||
return err
|
||||
}
|
||||
|
||||
//nolint:revive,exhaustive // missing default case
|
||||
switch saColNameExpr.valueType {
|
||||
case enumspb.INDEXED_VALUE_TYPE_KEYWORD_LIST:
|
||||
newExpr, err := c.convertKeywordListComparisonExpr(expr)
|
||||
@@ -377,6 +381,7 @@ func (c *QueryConverter) convertComparisonExpr(exprRef *sqlparser.Expr) error {
|
||||
*exprRef = newExpr
|
||||
}
|
||||
|
||||
//nolint:revive // missing default case
|
||||
switch expr.Operator {
|
||||
case sqlparser.StartsWithStr, sqlparser.NotStartsWithStr:
|
||||
valueExpr, ok := expr.Right.(*unsafeSQLString)
|
||||
@@ -400,7 +405,7 @@ func (c *QueryConverter) convertComparisonExpr(exprRef *sqlparser.Expr) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertRangeCond(exprRef *sqlparser.Expr) error {
|
||||
func (c *QueryConverterLegacy) convertRangeCond(exprRef *sqlparser.Expr) error {
|
||||
expr, ok := (*exprRef).(*sqlparser.RangeCond)
|
||||
if !ok {
|
||||
return query.NewConverterError(
|
||||
@@ -431,7 +436,7 @@ func (c *QueryConverter) convertRangeCond(exprRef *sqlparser.Expr) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertColName(exprRef *sqlparser.Expr) (*saColName, error) {
|
||||
func (c *QueryConverterLegacy) convertColName(exprRef *sqlparser.Expr) (*saColName, error) {
|
||||
expr, ok := (*exprRef).(*sqlparser.ColName)
|
||||
if !ok {
|
||||
return nil, query.NewConverterError(
|
||||
@@ -466,7 +471,7 @@ func (c *QueryConverter) convertColName(exprRef *sqlparser.Expr) (*saColName, er
|
||||
return newExpr, nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertValueExpr(
|
||||
func (c *QueryConverterLegacy) convertValueExpr(
|
||||
exprRef *sqlparser.Expr,
|
||||
name string,
|
||||
saFieldName string,
|
||||
@@ -539,7 +544,7 @@ func (c *QueryConverter) convertValueExpr(
|
||||
// For datetime, converts to UTC.
|
||||
// For execution status, converts string to enum value.
|
||||
// For execution duration, converts to nanoseconds.
|
||||
func (c *QueryConverter) parseSQLVal(
|
||||
func (c *QueryConverterLegacy) parseSQLVal(
|
||||
expr *sqlparser.SQLVal,
|
||||
saName string,
|
||||
saType enumspb.IndexedValueType,
|
||||
@@ -624,7 +629,7 @@ func (c *QueryConverter) parseSQLVal(
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func (c *QueryConverter) convertIsExpr(exprRef *sqlparser.Expr) error {
|
||||
func (c *QueryConverterLegacy) convertIsExpr(exprRef *sqlparser.Expr) error {
|
||||
expr, ok := (*exprRef).(*sqlparser.IsExpr)
|
||||
if !ok {
|
||||
return query.NewConverterError("`%s` is not an 'IS' expression", sqlparser.String(*exprRef))
|
||||
+2
-2
@@ -8,14 +8,14 @@ import (
|
||||
"go.temporal.io/server/common/searchattribute"
|
||||
)
|
||||
|
||||
func NewQueryConverter(
|
||||
func NewQueryConverterLegacy(
|
||||
pluginName string,
|
||||
namespaceName namespace.Name,
|
||||
namespaceID namespace.ID,
|
||||
saTypeMap searchattribute.NameTypeMap,
|
||||
saMapper searchattribute.Mapper,
|
||||
queryString string,
|
||||
) *QueryConverter {
|
||||
) *QueryConverterLegacy {
|
||||
switch pluginName {
|
||||
case mysql.PluginName:
|
||||
return newMySQLQueryConverter(namespaceName, namespaceID, saTypeMap, saMapper, queryString)
|
||||
+3
-3
@@ -43,7 +43,7 @@ var _ sqlparser.Expr = (*castExpr)(nil)
|
||||
var _ sqlparser.Expr = (*memberOfExpr)(nil)
|
||||
var _ sqlparser.Expr = (*jsonOverlapsExpr)(nil)
|
||||
|
||||
var _ pluginQueryConverter = (*mysqlQueryConverter)(nil)
|
||||
var _ pluginQueryConverterLegacy = (*mysqlQueryConverter)(nil)
|
||||
|
||||
func (node *castExpr) Format(buf *sqlparser.TrackedBuffer) {
|
||||
buf.Myprintf("cast(%v as %v)", node.Value, node.Type)
|
||||
@@ -63,7 +63,7 @@ func newMySQLQueryConverter(
|
||||
saTypeMap searchattribute.NameTypeMap,
|
||||
saMapper searchattribute.Mapper,
|
||||
queryString string,
|
||||
) *QueryConverter {
|
||||
) *QueryConverterLegacy {
|
||||
return newQueryConverterInternal(
|
||||
&mysqlQueryConverter{},
|
||||
namespaceName,
|
||||
@@ -189,7 +189,7 @@ func (c *mysqlQueryConverter) buildSelectStmt(
|
||||
namespaceID namespace.ID,
|
||||
queryString string,
|
||||
pageSize int,
|
||||
token *pageToken,
|
||||
token *pageTokenLegacy,
|
||||
) (string, []any) {
|
||||
var whereClauses []string
|
||||
var queryArgs []any
|
||||
+3
-3
@@ -32,7 +32,7 @@ var (
|
||||
)
|
||||
|
||||
var _ sqlparser.Expr = (*pgCastExpr)(nil)
|
||||
var _ pluginQueryConverter = (*pgQueryConverter)(nil)
|
||||
var _ pluginQueryConverterLegacy = (*pgQueryConverter)(nil)
|
||||
|
||||
func (node *pgCastExpr) Format(buf *sqlparser.TrackedBuffer) {
|
||||
buf.Myprintf("%v::%v", node.Value, node.Type)
|
||||
@@ -44,7 +44,7 @@ func newPostgreSQLQueryConverter(
|
||||
saTypeMap searchattribute.NameTypeMap,
|
||||
saMapper searchattribute.Mapper,
|
||||
queryString string,
|
||||
) *QueryConverter {
|
||||
) *QueryConverterLegacy {
|
||||
return newQueryConverterInternal(
|
||||
&pgQueryConverter{},
|
||||
namespaceName,
|
||||
@@ -196,7 +196,7 @@ func (c *pgQueryConverter) buildSelectStmt(
|
||||
namespaceID namespace.ID,
|
||||
queryString string,
|
||||
pageSize int,
|
||||
token *pageToken,
|
||||
token *pageTokenLegacy,
|
||||
) (string, []any) {
|
||||
var whereClauses []string
|
||||
var queryArgs []any
|
||||
+3
-3
@@ -15,7 +15,7 @@ type (
|
||||
sqliteQueryConverter struct{}
|
||||
)
|
||||
|
||||
var _ pluginQueryConverter = (*sqliteQueryConverter)(nil)
|
||||
var _ pluginQueryConverterLegacy = (*sqliteQueryConverter)(nil)
|
||||
|
||||
const (
|
||||
keywordListTypeFtsTableName = "executions_visibility_fts_keyword_list"
|
||||
@@ -28,7 +28,7 @@ func newSqliteQueryConverter(
|
||||
saTypeMap searchattribute.NameTypeMap,
|
||||
saMapper searchattribute.Mapper,
|
||||
queryString string,
|
||||
) *QueryConverter {
|
||||
) *QueryConverterLegacy {
|
||||
return newQueryConverterInternal(
|
||||
&sqliteQueryConverter{},
|
||||
namespaceName,
|
||||
@@ -205,7 +205,7 @@ func (c *sqliteQueryConverter) buildSelectStmt(
|
||||
namespaceID namespace.ID,
|
||||
queryString string,
|
||||
pageSize int,
|
||||
token *pageToken,
|
||||
token *pageTokenLegacy,
|
||||
) (string, []any) {
|
||||
var whereClauses []string
|
||||
var queryArgs []any
|
||||
+10
-10
@@ -22,8 +22,8 @@ type (
|
||||
suite.Suite
|
||||
*require.Assertions
|
||||
|
||||
pqc pluginQueryConverter
|
||||
queryConverter *QueryConverter
|
||||
pqc pluginQueryConverterLegacy
|
||||
queryConverter *QueryConverterLegacy
|
||||
}
|
||||
|
||||
testCase struct {
|
||||
@@ -61,43 +61,43 @@ func (s *queryConverterSuite) TestConvertWhereString() {
|
||||
{
|
||||
name: "empty string",
|
||||
input: "",
|
||||
output: &queryParams{queryString: "TemporalNamespaceDivision is null"},
|
||||
output: &queryParamsLegacy{queryString: "TemporalNamespaceDivision is null"},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
name: "single condition int",
|
||||
input: "AliasForInt01 = 1",
|
||||
output: &queryParams{queryString: "(Int01 = 1) and TemporalNamespaceDivision is null"},
|
||||
output: &queryParamsLegacy{queryString: "(Int01 = 1) and TemporalNamespaceDivision is null"},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
name: "single condition keyword",
|
||||
input: "AliasForKeyword01 = 1",
|
||||
output: &queryParams{queryString: "(Keyword01 = 1) and TemporalNamespaceDivision is null"},
|
||||
output: &queryParamsLegacy{queryString: "(Keyword01 = 1) and TemporalNamespaceDivision is null"},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
name: "or condition keyword",
|
||||
input: "AliasForInt01 = 1 OR AliasForKeyword01 = 1",
|
||||
output: &queryParams{queryString: "(Int01 = 1 or Keyword01 = 1) and TemporalNamespaceDivision is null"},
|
||||
output: &queryParamsLegacy{queryString: "(Int01 = 1 or Keyword01 = 1) and TemporalNamespaceDivision is null"},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
name: "no double parenthesis",
|
||||
input: "(AliasForInt01 = 1 OR AliasForKeyword01 = 1)",
|
||||
output: &queryParams{queryString: "(Int01 = 1 or Keyword01 = 1) and TemporalNamespaceDivision is null"},
|
||||
output: &queryParamsLegacy{queryString: "(Int01 = 1 or Keyword01 = 1) and TemporalNamespaceDivision is null"},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
name: "has namespace division",
|
||||
input: "(AliasForInt01 = 1 OR AliasForKeyword01 = 1) AND TemporalNamespaceDivision = 'foo'",
|
||||
output: &queryParams{queryString: "((Int01 = 1 or Keyword01 = 1) and TemporalNamespaceDivision = 'foo')"},
|
||||
output: &queryParamsLegacy{queryString: "((Int01 = 1 or Keyword01 = 1) and TemporalNamespaceDivision = 'foo')"},
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
name: "group by one field",
|
||||
input: "GROUP BY ExecutionStatus",
|
||||
output: &queryParams{
|
||||
output: &queryParamsLegacy{
|
||||
queryString: "TemporalNamespaceDivision is null",
|
||||
groupBy: []string{searchattribute.ExecutionStatus},
|
||||
},
|
||||
@@ -853,7 +853,7 @@ func (s *queryConverterSuite) TestParseSQLVal() {
|
||||
"saName": "AliasForDatetime01",
|
||||
"saType": enumspb.INDEXED_VALUE_TYPE_DATETIME,
|
||||
},
|
||||
retValue: fmt.Sprintf("%s", dt.Format(s.queryConverter.getDatetimeFormat())),
|
||||
retValue: dt.Format(s.queryConverter.getDatetimeFormat()),
|
||||
err: nil,
|
||||
},
|
||||
{
|
||||
@@ -171,7 +171,7 @@ func (s *VisibilityStore) ListWorkflowExecutions(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
converter := NewQueryConverter(
|
||||
converter := NewQueryConverterLegacy(
|
||||
s.GetName(),
|
||||
request.Namespace,
|
||||
request.NamespaceID,
|
||||
@@ -213,7 +213,7 @@ func (s *VisibilityStore) ListWorkflowExecutions(
|
||||
if lastRow.CloseTime != nil {
|
||||
closeTime = *lastRow.CloseTime
|
||||
}
|
||||
nextPageToken, err = serializePageToken(&pageToken{
|
||||
nextPageToken, err = serializePageTokenLegacy(&pageTokenLegacy{
|
||||
CloseTime: closeTime,
|
||||
StartTime: lastRow.StartTime,
|
||||
RunID: lastRow.RunID,
|
||||
@@ -242,7 +242,7 @@ func (s *VisibilityStore) CountWorkflowExecutions(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
converter := NewQueryConverter(
|
||||
converter := NewQueryConverterLegacy(
|
||||
s.GetName(),
|
||||
request.Namespace,
|
||||
request.NamespaceID,
|
||||
|
||||
@@ -64,7 +64,7 @@ func getQueryFields(
|
||||
queryString string,
|
||||
) ([]string, error) {
|
||||
fnInterceptor := newFieldNameAggInterceptor(namespaceName, saNameType, saMapperProvider)
|
||||
queryConverter := elasticsearch.NewQueryConverter(fnInterceptor, nil, saNameType)
|
||||
queryConverter := elasticsearch.NewQueryConverterLegacy(fnInterceptor, nil, saNameType)
|
||||
_, err := queryConverter.ConvertWhereOrderBy(queryString)
|
||||
if err != nil {
|
||||
var converterErr *query.ConverterError
|
||||
|
||||
Reference in New Issue
Block a user