fix(module,store): nillable filter and query options

This commit is contained in:
wpetit 2023-02-17 13:01:39 +01:00
parent 3e601272d7
commit 4606d7a08d
2 changed files with 39 additions and 22 deletions

View File

@ -91,22 +91,24 @@ func (m *StoreModule) query(call goja.FunctionCall, rt *goja.Runtime) goja.Value
queryOptionsFuncs := make([]storage.QueryOptionFunc, 0) queryOptionsFuncs := make([]storage.QueryOptionFunc, 0)
if queryOptions.Limit != nil { if queryOptions != nil {
queryOptionsFuncs = append(queryOptionsFuncs, storage.WithLimit(*queryOptions.Limit)) if queryOptions.Limit != nil {
} queryOptionsFuncs = append(queryOptionsFuncs, storage.WithLimit(*queryOptions.Limit))
}
if queryOptions.OrderBy != nil { if queryOptions.OrderBy != nil {
queryOptionsFuncs = append(queryOptionsFuncs, storage.WithOrderBy(*queryOptions.OrderBy)) queryOptionsFuncs = append(queryOptionsFuncs, storage.WithOrderBy(*queryOptions.OrderBy))
} }
if queryOptions.Offset != nil { if queryOptions.Offset != nil {
queryOptionsFuncs = append(queryOptionsFuncs, storage.WithOffset(*queryOptions.Limit)) queryOptionsFuncs = append(queryOptionsFuncs, storage.WithOffset(*queryOptions.Limit))
} }
if queryOptions.OrderDirection != nil { if queryOptions.OrderDirection != nil {
queryOptionsFuncs = append(queryOptionsFuncs, storage.WithOrderDirection( queryOptionsFuncs = append(queryOptionsFuncs, storage.WithOrderDirection(
storage.OrderDirection(*queryOptions.OrderDirection), storage.OrderDirection(*queryOptions.OrderDirection),
)) ))
}
} }
documents, err := m.store.Query(ctx, collection, filter, queryOptionsFuncs...) documents, err := m.store.Query(ctx, collection, filter, queryOptionsFuncs...)
@ -144,6 +146,10 @@ func (m *StoreModule) assertCollection(value goja.Value, rt *goja.Runtime) strin
} }
func (m *StoreModule) assertFilter(value goja.Value, rt *goja.Runtime) *filter.Filter { func (m *StoreModule) assertFilter(value goja.Value, rt *goja.Runtime) *filter.Filter {
if value.Export() == nil {
return nil
}
rawFilter, ok := value.Export().(map[string]interface{}) rawFilter, ok := value.Export().(map[string]interface{})
if !ok { if !ok {
panic(rt.NewTypeError(fmt.Sprintf("filter must be an object, got '%T'", value.Export()))) panic(rt.NewTypeError(fmt.Sprintf("filter must be an object, got '%T'", value.Export())))
@ -172,6 +178,10 @@ func (m *StoreModule) assertDocumentID(value goja.Value, rt *goja.Runtime) stora
} }
func (m *StoreModule) assertQueryOptions(value goja.Value, rt *goja.Runtime) *queryOptions { func (m *StoreModule) assertQueryOptions(value goja.Value, rt *goja.Runtime) *queryOptions {
if value.Export() == nil {
return nil
}
rawQueryOptions, ok := value.Export().(map[string]interface{}) rawQueryOptions, ok := value.Export().(map[string]interface{})
if !ok { if !ok {
panic(rt.NewTypeError(fmt.Sprintf("query options must be an object, got '%T'", value.Export()))) panic(rt.NewTypeError(fmt.Sprintf("query options must be an object, got '%T'", value.Export())))

View File

@ -93,15 +93,22 @@ func (s *DocumentStore) Query(ctx context.Context, collection string, filter *fi
var documents []storage.Document var documents []storage.Document
err := s.withTx(ctx, func(tx *sql.Tx) error { err := s.withTx(ctx, func(tx *sql.Tx) error {
criteria, args, err := filterSQL.ToSQL( criteria := "1 = 1"
filter.Root(), args := make([]any, 0)
filterSQL.WithPreparedParameter("$", 2),
filterSQL.WithKeyTransform(func(key string) string { var err error
return fmt.Sprintf("json_extract(data, '$.%s')", key)
}), if filter != nil {
) criteria, args, err = filterSQL.ToSQL(
if err != nil { filter.Root(),
return errors.WithStack(err) filterSQL.WithPreparedParameter("$", 2),
filterSQL.WithKeyTransform(func(key string) string {
return fmt.Sprintf("json_extract(data, '$.%s')", key)
}),
)
if err != nil {
return errors.WithStack(err)
}
} }
query := ` query := `