mirror of
https://github.com/hanzoai/tasks.git
synced 2026-10-04 02:04:03 +00:00
## 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.
22 lines
939 B
Go
22 lines
939 B
Go
package query
|
|
|
|
// SearchAttributeInterceptor is used in the query converter to intercept the search attributes
|
|
// used in the filters of the query.
|
|
// Eg: if the query is `ExecutionStatus = 'Running' AND CustomKeywordField = 'foo'`, the interceptor
|
|
// will be called for the `ExecutionStatus` and `CustomKeywordField` search attributes.
|
|
// The interceptor can be useful if you need to capture the search attributes used in the query, or
|
|
// if you need to modify the field name that is used to query the data store.
|
|
type SearchAttributeInterceptor interface {
|
|
Intercept(col *SAColumn) error
|
|
}
|
|
|
|
// NopSearchAttributeInterceptor is a dummy interceptor and the default interceptor used in the
|
|
// query converter.
|
|
type NopSearchAttributeInterceptor struct{}
|
|
|
|
var nopSearchAttributeInterceptor SearchAttributeInterceptor = &NopSearchAttributeInterceptor{}
|
|
|
|
func (i *NopSearchAttributeInterceptor) Intercept(col *SAColumn) error {
|
|
return nil
|
|
}
|