1
0
mirror of https://github.com/rancher/steve.git synced 2025-09-10 03:40:17 +00:00

Move types related to list options and sql queries into their own package.

The problem having these in the informer package is that eventually code
in other packages will need to import `informer` only for constants or types,
but some members of the informer package may already depend on those. Best to
move type definitions into their own simpler package.
This commit is contained in:
Eric Promislow
2025-04-24 13:50:15 -07:00
parent 392a95f753
commit f73b1e35b6
13 changed files with 471 additions and 455 deletions

View File

@@ -11,6 +11,7 @@ import (
"database/sql"
"errors"
"fmt"
"github.com/rancher/steve/pkg/sqlcache/sqltypes"
"reflect"
"strings"
"testing"
@@ -255,7 +256,7 @@ func TestNewListOptionIndexer(t *testing.T) {
func TestListByOptions(t *testing.T) {
type testCase struct {
description string
listOptions ListOptions
listOptions sqltypes.ListOptions
partitions []partition.Partition
ns string
expectedCountStmt string
@@ -276,7 +277,7 @@ func TestListByOptions(t *testing.T) {
var tests []testCase
tests = append(tests, testCase{
description: "ListByOptions() with no errors returned, should not return an error",
listOptions: ListOptions{},
listOptions: sqltypes.ListOptions{},
partitions: []partition.Partition{},
ns: "",
expectedStmt: `SELECT o.object, o.objectnonce, o.dekid FROM "something" o
@@ -291,8 +292,8 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions() with an empty filter, should not return an error",
listOptions: ListOptions{
Filters: []OrFilter{{[]Filter{}}},
listOptions: sqltypes.ListOptions{
Filters: []sqltypes.OrFilter{{[]sqltypes.Filter{}}},
},
partitions: []partition.Partition{},
ns: "",
@@ -307,7 +308,7 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with ChunkSize set should set limit in prepared sql.Stmt",
listOptions: ListOptions{ChunkSize: 2},
listOptions: sqltypes.ListOptions{ChunkSize: 2},
partitions: []partition.Partition{},
ns: "",
expectedStmt: `SELECT o.object, o.objectnonce, o.dekid FROM "something" o
@@ -329,7 +330,7 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with Resume set should set offset in prepared sql.Stmt",
listOptions: ListOptions{Resume: "4"},
listOptions: sqltypes.ListOptions{Resume: "4"},
partitions: []partition.Partition{},
ns: "",
expectedStmt: `SELECT o.object, o.objectnonce, o.dekid FROM "something" o
@@ -351,13 +352,13 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with 1 OrFilter set with 1 filter should select where that filter is true in prepared sql.Stmt",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"somevalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
},
@@ -380,13 +381,13 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with 1 OrFilter set with 1 filter with Op set top NotEq should select where that filter is not true in prepared sql.Stmt",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"somevalue"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: true,
},
},
@@ -409,13 +410,13 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with 1 OrFilter set with 1 filter with Partial set to true should select where that partial match on that filter's value is true in prepared sql.Stmt",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"somevalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
},
@@ -438,25 +439,25 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with 1 OrFilter set with multiple filters should select where any of those filters are true in prepared sql.Stmt",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"somevalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
{
Field: []string{"metadata", "somefield"},
Matches: []string{"someothervalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
{
Field: []string{"metadata", "somefield"},
Matches: []string{"somethirdvalue"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: true,
},
},
@@ -479,29 +480,29 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with multiple OrFilters set should select where all OrFilters contain one filter that is true in prepared sql.Stmt",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"value1"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
{
Field: []string{"status", "someotherfield"},
Matches: []string{"value2"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: false,
},
},
},
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"value3"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
},
@@ -526,13 +527,13 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with labels filter should select the label in the prepared sql.Stmt",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "guard.cattle.io"},
Matches: []string{"lodgepole"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
},
@@ -558,23 +559,23 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions with two labels filters should use a self-join",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "cows"},
Matches: []string{"milk"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
},
},
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "horses"},
Matches: []string{"saddles"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
},
@@ -602,23 +603,23 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions with a mix of one label and one non-label query can still self-join",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "cows"},
Matches: []string{"butter"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
},
},
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "somefield"},
Matches: []string{"wheat"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
},
@@ -645,10 +646,10 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions with only one Sort.Field set should sort on that field only, in ascending order in prepared sql.Stmt",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}},
Orders: []SortOrder{ASC},
Orders: []sqltypes.SortOrder{sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -668,10 +669,10 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "sort one field descending",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}},
Orders: []SortOrder{DESC},
Orders: []sqltypes.SortOrder{sqltypes.DESC},
},
},
partitions: []partition.Partition{},
@@ -691,10 +692,10 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "sort one unbound label descending",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "labels", "flip"}},
Orders: []SortOrder{DESC},
Orders: []sqltypes.SortOrder{sqltypes.DESC},
},
},
partitions: []partition.Partition{},
@@ -716,10 +717,10 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions sorting on two complex fields should sort on the first field in ascending order first and then sort on the second labels field in ascending order in prepared sql.Stmt",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "fields", "3"}, {"metadata", "labels", "stub.io/candy"}},
Orders: []SortOrder{ASC, ASC},
Orders: []sqltypes.SortOrder{sqltypes.ASC, sqltypes.ASC},
},
},
extraIndexedFields: []string{"metadata.fields[3]", "metadata.labels[stub.io/candy]"},
@@ -740,10 +741,10 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions sorting on two fields should sort on the first field in ascending order first and then sort on the second field in ascending order in prepared sql.Stmt",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}, {"status", "someotherfield"}},
Orders: []SortOrder{ASC, ASC},
Orders: []sqltypes.SortOrder{sqltypes.ASC, sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -761,10 +762,10 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions sorting on two fields should sort on the first field in descending order first and then sort on the second field in ascending order in prepared sql.Stmt",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}, {"status", "someotherfield"}},
Orders: []SortOrder{DESC, ASC},
Orders: []sqltypes.SortOrder{sqltypes.DESC, sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -782,10 +783,10 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions sorting when # fields != # sort orders should return an error",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}, {"status", "someotherfield"}},
Orders: []SortOrder{DESC, ASC, ASC},
Orders: []sqltypes.SortOrder{sqltypes.DESC, sqltypes.ASC, sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -803,8 +804,8 @@ func TestListByOptions(t *testing.T) {
tests = append(tests, testCase{
description: "ListByOptions with Pagination.PageSize set should set limit to PageSize in prepared sql.Stmt",
listOptions: ListOptions{
Pagination: Pagination{
listOptions: sqltypes.ListOptions{
Pagination: sqltypes.Pagination{
PageSize: 10,
},
},
@@ -829,8 +830,8 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with Pagination.Page and no PageSize set should not add anything to prepared sql.Stmt",
listOptions: ListOptions{
Pagination: Pagination{
listOptions: sqltypes.ListOptions{
Pagination: sqltypes.Pagination{
Page: 2,
},
},
@@ -848,8 +849,8 @@ func TestListByOptions(t *testing.T) {
})
tests = append(tests, testCase{
description: "ListByOptions with Pagination.Page and PageSize set limit to PageSize and offset to PageSize * (Page - 1) in prepared sql.Stmt",
listOptions: ListOptions{
Pagination: Pagination{
listOptions: sqltypes.ListOptions{
Pagination: sqltypes.Pagination{
PageSize: 10,
Page: 2,
},
@@ -1028,7 +1029,7 @@ func TestListByOptions(t *testing.T) {
func TestConstructQuery(t *testing.T) {
type testCase struct {
description string
listOptions ListOptions
listOptions sqltypes.ListOptions
partitions []partition.Partition
ns string
expectedCountStmt string
@@ -1041,13 +1042,13 @@ func TestConstructQuery(t *testing.T) {
var tests []testCase
tests = append(tests, testCase{
description: "TestConstructQuery: handles IN statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "queryField1"},
Matches: []string{"somevalue"},
Op: In,
Op: sqltypes.In,
},
},
},
@@ -1066,13 +1067,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles NOT-IN statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "queryField1"},
Matches: []string{"somevalue"},
Op: NotIn,
Op: sqltypes.NotIn,
},
},
},
@@ -1091,12 +1092,12 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles EXISTS statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "queryField1"},
Op: Exists,
Op: sqltypes.Exists,
},
},
},
@@ -1108,12 +1109,12 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles NOT-EXISTS statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "queryField1"},
Op: NotExists,
Op: sqltypes.NotExists,
},
},
},
@@ -1125,13 +1126,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles == statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelEqualFull"},
Matches: []string{"somevalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: false,
},
},
@@ -1152,13 +1153,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles == statements for label statements, match partial",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelEqualPartial"},
Matches: []string{"somevalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
},
@@ -1179,13 +1180,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles != statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelNotEqualFull"},
Matches: []string{"somevalue"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: false,
},
},
@@ -1210,13 +1211,13 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: handles != statements for label statements, match partial",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelNotEqualPartial"},
Matches: []string{"somevalue"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: true,
},
},
@@ -1241,23 +1242,23 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: handles multiple != statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "notEqual1"},
Matches: []string{"value1"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: false,
},
},
},
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "notEqual2"},
Matches: []string{"value2"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: false,
},
},
@@ -1286,13 +1287,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles IN statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelIN"},
Matches: []string{"somevalue1", "someValue2"},
Op: In,
Op: sqltypes.In,
},
},
},
@@ -1313,13 +1314,13 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: handles NOTIN statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelNOTIN"},
Matches: []string{"somevalue1", "someValue2"},
Op: NotIn,
Op: sqltypes.NotIn,
},
},
},
@@ -1343,13 +1344,13 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: handles EXISTS statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelEXISTS"},
Matches: []string{},
Op: Exists,
Op: sqltypes.Exists,
},
},
},
@@ -1370,13 +1371,13 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: handles NOTEXISTS statements for label statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelNOTEXISTS"},
Matches: []string{},
Op: NotExists,
Op: sqltypes.NotExists,
},
},
},
@@ -1399,13 +1400,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles LessThan statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "numericThing"},
Matches: []string{"5"},
Op: Lt,
Op: sqltypes.Lt,
},
},
},
@@ -1425,13 +1426,13 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "TestConstructQuery: handles GreaterThan statements",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "numericThing"},
Matches: []string{"35"},
Op: Gt,
Op: sqltypes.Gt,
},
},
},
@@ -1451,19 +1452,19 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "multiple filters with a positive label test and a negative non-label test still outer-join",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "junta"},
Matches: []string{"esther"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
{
Field: []string{"metadata", "queryField1"},
Matches: []string{"golgi"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: true,
},
},
@@ -1484,33 +1485,33 @@ func TestConstructQuery(t *testing.T) {
})
tests = append(tests, testCase{
description: "multiple filters and or-filters with a positive label test and a negative non-label test still outer-join and have correct AND/ORs",
listOptions: ListOptions{Filters: []OrFilter{
listOptions: sqltypes.ListOptions{Filters: []sqltypes.OrFilter{
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "nectar"},
Matches: []string{"stash"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
{
Field: []string{"metadata", "queryField1"},
Matches: []string{"landlady"},
Op: NotEq,
Op: sqltypes.NotEq,
Partial: false,
},
},
},
{
Filters: []Filter{
Filters: []sqltypes.Filter{
{
Field: []string{"metadata", "labels", "lawn"},
Matches: []string{"reba", "coil"},
Op: In,
Op: sqltypes.In,
},
{
Field: []string{"metadata", "queryField1"},
Op: Gt,
Op: sqltypes.Gt,
Matches: []string{"2"},
},
},
@@ -1534,22 +1535,22 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: handles == statements for label statements, match partial, sort on metadata.queryField1",
listOptions: ListOptions{
Filters: []OrFilter{
listOptions: sqltypes.ListOptions{
Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "labels", "labelEqualPartial"},
Matches: []string{"somevalue"},
Op: Eq,
Op: sqltypes.Eq,
Partial: true,
},
},
},
},
Sort: Sort{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "queryField1"}},
Orders: []SortOrder{ASC},
Orders: []sqltypes.SortOrder{sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -1567,10 +1568,10 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "ConstructQuery: sorting when # fields < # sort orders should return an error",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}, {"status", "someotherfield"}},
Orders: []SortOrder{DESC, ASC, ASC},
Orders: []sqltypes.SortOrder{sqltypes.DESC, sqltypes.ASC, sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -1582,10 +1583,10 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: sort on label statements with no query",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "labels", "this"}},
Orders: []SortOrder{ASC},
Orders: []sqltypes.SortOrder{sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -1603,26 +1604,26 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "TestConstructQuery: sort and query on both labels and non-labels without overlap",
listOptions: ListOptions{
Filters: []OrFilter{
listOptions: sqltypes.ListOptions{
Filters: []sqltypes.OrFilter{
{
[]Filter{
[]sqltypes.Filter{
{
Field: []string{"metadata", "queryField1"},
Matches: []string{"toys"},
Op: Eq,
Op: sqltypes.Eq,
},
{
Field: []string{"metadata", "labels", "jamb"},
Matches: []string{"juice"},
Op: Eq,
Op: sqltypes.Eq,
},
},
},
},
Sort: Sort{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "labels", "this"}, {"status", "queryField2"}},
Orders: []SortOrder{ASC, DESC},
Orders: []sqltypes.SortOrder{sqltypes.ASC, sqltypes.DESC},
},
},
partitions: []partition.Partition{},
@@ -1641,10 +1642,10 @@ func TestConstructQuery(t *testing.T) {
tests = append(tests, testCase{
description: "ConstructQuery: sorting when # fields > # sort orders should return an error",
listOptions: ListOptions{
Sort: Sort{
listOptions: sqltypes.ListOptions{
Sort: sqltypes.Sort{
Fields: [][]string{{"metadata", "somefield"}, {"status", "someotherfield"}, {"metadata", "labels", "a1"}, {"metadata", "labels", "a2"}},
Orders: []SortOrder{DESC, ASC, ASC},
Orders: []sqltypes.SortOrder{sqltypes.DESC, sqltypes.ASC, sqltypes.ASC},
},
},
partitions: []partition.Partition{},
@@ -1748,7 +1749,7 @@ func TestBuildSortLabelsClause(t *testing.T) {
joinTableIndexByLabelName map[string]int
direction bool
expectedStmt string
expectedParam string
expectedParam string
expectedErr string
}