mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-09 22:51:02 +00:00
SetContains returns null if either of the values it's given is null. SetContainsAny and SetContainsAll should also do this.
439 lines
12 KiB
Go
439 lines
12 KiB
Go
package defs
|
|
|
|
// set literal tests
|
|
var setLiteralTests = TableTest{
|
|
name: "selectwithsetliterals",
|
|
Table: tbl(
|
|
"selectwithsetliterals",
|
|
srcHdrs(
|
|
srcHdr("_id", fldTypeID),
|
|
srcHdr("a", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("b", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("event", fldTypeStringSet),
|
|
srcHdr("ievent", fldTypeIDSet),
|
|
),
|
|
srcRows(
|
|
srcRow(int64(1), int64(10), int64(100), []string{"POST"}, nil),
|
|
srcRow(int64(2), int64(20), int64(200), []string{"GET"}, nil),
|
|
srcRow(int64(3), int64(30), int64(300), []string{"GET", "POST"}, []int64{101}),
|
|
),
|
|
),
|
|
SQLTests: []SQLTest{
|
|
{
|
|
// SetContainsSelectList
|
|
name: "set-contains-select-list",
|
|
SQLs: sqls(
|
|
"select _id, setcontains(event, 'POST') from selectwithsetliterals",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), true),
|
|
row(int64(2), false),
|
|
row(int64(3), true),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsSelectListInt
|
|
name: "set-contains-select-list-int",
|
|
SQLs: sqls(
|
|
"select _id, setcontains(ievent, 101) from selectwithsetliterals",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), nil),
|
|
row(int64(2), nil),
|
|
row(int64(3), true),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsWithLiteral
|
|
// SetContainsWithLiteralInt
|
|
// SetContainsWithLiteralAny
|
|
// SetContainsWithLiteralAnyInt
|
|
// SetContainsWithLiteralAll
|
|
// SetContainsWithLiteralAllInt
|
|
name: "set-contains-with-literal",
|
|
SQLs: sqls(
|
|
"select _id, setcontains(['POST'], 'POST') from selectwithsetliterals",
|
|
"select _id, setcontains([101], 101) from selectwithsetliterals",
|
|
"select _id, setcontainsany(['POST'], ['POST']) from selectwithsetliterals",
|
|
"select _id, setcontainsany([101], [101]) from selectwithsetliterals",
|
|
"select _id, setcontainsall(['POST'], ['POST']) from selectwithsetliterals",
|
|
"select _id, setcontainsall([101], [101]) from selectwithsetliterals",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), true),
|
|
row(int64(2), true),
|
|
row(int64(3), true),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
},
|
|
}
|
|
|
|
// set function tests
|
|
var setFunctionTests = TableTest{
|
|
name: "selectwithset",
|
|
Table: tbl(
|
|
"selectwithset",
|
|
srcHdrs(
|
|
srcHdr("_id", fldTypeID),
|
|
srcHdr("a", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("b", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("event", fldTypeStringSet),
|
|
srcHdr("ievent", fldTypeIDSet),
|
|
),
|
|
srcRows(
|
|
srcRow(int64(1), int64(10), int64(100), []string{"POST"}, []int64{101}),
|
|
srcRow(int64(2), int64(20), int64(200), []string{"GET"}, []int64(nil)),
|
|
srcRow(int64(3), int64(30), int64(300), []string{"GET", "POST"}, []int64(nil)),
|
|
),
|
|
),
|
|
SQLTests: []SQLTest{
|
|
{
|
|
name: "set-contains",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, 'POST')",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("a", fldTypeInt),
|
|
hdr("b", fldTypeInt),
|
|
hdr("event", fldTypeStringSet),
|
|
hdr("ievent", fldTypeIDSet),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), int64(10), int64(100), []string{"POST"}, []int64{101}),
|
|
row(int64(3), int64(30), int64(300), []string{"GET", "POST"}, nil),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
SortStringKeys: true,
|
|
},
|
|
{
|
|
// SetContains
|
|
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, 'POST')",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("a", fldTypeInt),
|
|
hdr("b", fldTypeInt),
|
|
hdr("event", fldTypeStringSet),
|
|
hdr("ievent", fldTypeIDSet),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), int64(10), int64(100), []string{"POST"}, []int64{101}),
|
|
row(int64(3), int64(30), int64(300), []string{"GET", "POST"}, nil),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
SortStringKeys: true,
|
|
},
|
|
{
|
|
// SetContainsInt
|
|
name: "set-contains-int",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(ievent, 101)",
|
|
"select * from selectwithset where setcontainsany(ievent, [101])",
|
|
"select * from selectwithset where setcontainsall(ievent, [101])",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("a", fldTypeInt),
|
|
hdr("b", fldTypeInt),
|
|
hdr("event", fldTypeStringSet),
|
|
hdr("ievent", fldTypeIDSet),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), int64(10), int64(100), []string{"POST"}, []int64{101}),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsInt
|
|
name: "set-contains-int-using-value",
|
|
SQLs: sqls(
|
|
"select _id, setcontainsany(ievent, [101]) from selectwithset",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), true),
|
|
row(int64(2), nil),
|
|
row(int64(3), nil),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsOrSetContains
|
|
// SetContainsAny
|
|
name: "set-contains-or-set-contains",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, 'POST') or setcontains(event, 'GET')",
|
|
"select * from selectwithset where setcontainsany(event, ['POST', 'GET'])",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("a", fldTypeInt),
|
|
hdr("b", fldTypeInt),
|
|
hdr("event", fldTypeStringSet),
|
|
hdr("ievent", fldTypeIDSet),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), int64(10), int64(100), []string{"POST"}, []int64{101}),
|
|
row(int64(2), int64(20), int64(200), []string{"GET"}, nil),
|
|
row(int64(3), int64(30), int64(300), []string{"GET", "POST"}, nil),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
SortStringKeys: true,
|
|
},
|
|
{
|
|
// SetContainsAndSetContains
|
|
// SetContainsAll
|
|
name: "set-contains-and-set-contains",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, 'POST') and setcontains(event, 'GET')",
|
|
"select * from selectwithset where setcontainsall(event, ['POST', 'GET'])",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("a", fldTypeInt),
|
|
hdr("b", fldTypeInt),
|
|
hdr("event", fldTypeStringSet),
|
|
hdr("ievent", fldTypeIDSet),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(3), int64(30), int64(300), []string{"GET", "POST"}, nil),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
SortStringKeys: true,
|
|
},
|
|
{
|
|
// SetContainsWrongType
|
|
name: "set-contains-wrong-type",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, 1)",
|
|
),
|
|
ExpErr: "types 'stringset' and 'int' are not equatable",
|
|
},
|
|
{
|
|
// SetContainsWrongTypeInt
|
|
name: "set-contains-wrong-type-int",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(ievent, 'foo')",
|
|
),
|
|
ExpErr: "types 'idset' and 'string' are not equatable",
|
|
},
|
|
{
|
|
// SetContainsWrongTypeSet
|
|
name: "set-contains-wrong-type-set",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, ['foo'])",
|
|
),
|
|
ExpErr: "types 'stringset' and 'stringset' are not equatable",
|
|
},
|
|
{
|
|
// SetContainsWrongTypeSet
|
|
name: "set-contains-null-in-values",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, [null])",
|
|
),
|
|
ExpErr: "set literal must contain ints or strings",
|
|
},
|
|
{
|
|
// SetContainsWrongTypeSet
|
|
name: "set-contains-null-value",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(event, null)",
|
|
),
|
|
ExpErr: "types 'stringset' and 'void' are not equatable",
|
|
},
|
|
{
|
|
// SetContainsWrongTypeSet
|
|
name: "set-contains-null-set",
|
|
SQLs: sqls(
|
|
"select * from selectwithset where setcontains(null, [1])",
|
|
),
|
|
ExpErr: "set expression expected",
|
|
},
|
|
},
|
|
}
|
|
|
|
// set parameter tests
|
|
var setParameterTests = TableTest{
|
|
|
|
Table: tbl(
|
|
"selectwithsetparams",
|
|
srcHdrs(
|
|
srcHdr("_id", fldTypeID),
|
|
srcHdr("a", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("b", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("event", fldTypeStringSet),
|
|
srcHdr("ievent", fldTypeIDSet),
|
|
),
|
|
srcRows(
|
|
srcRow(int64(1), int64(10), int64(100), []string{"POST"}, []int64{101}),
|
|
srcRow(int64(2), int64(20), int64(200), []string{"GET"}, nil),
|
|
srcRow(int64(3), int64(30), int64(300), []string{"GET", "POST"}, nil),
|
|
),
|
|
),
|
|
SQLTests: []SQLTest{
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontains(['POST', 'GET'])",
|
|
),
|
|
ExpErr: "count of formal parameters (2) does not match count of actual parameters (1)",
|
|
},
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontains(1, 2)",
|
|
),
|
|
ExpErr: "set expression expected",
|
|
},
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontains(['POST', 'GET'], 1)",
|
|
),
|
|
ExpErr: "types 'stringset' and 'int' are not equatable",
|
|
},
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontains([1, 2], '1')",
|
|
),
|
|
ExpErr: "types 'idset' and 'string' are not equatable",
|
|
},
|
|
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontainsall(['POST', 'GET'])",
|
|
"select setcontainsany(['POST', 'GET'])",
|
|
),
|
|
ExpErr: "count of formal parameters (2) does not match count of actual parameters (1)",
|
|
},
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontainsall(1, 2)",
|
|
"select setcontainsany(1, 2)",
|
|
),
|
|
ExpErr: "set expression expected",
|
|
},
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontainsall(['POST', 'GET'], [1, 2])",
|
|
"select setcontainsany(['POST', 'GET'], [1, 2])",
|
|
),
|
|
ExpErr: "types 'string' and 'id' are not equatable",
|
|
},
|
|
{
|
|
SQLs: sqls(
|
|
"select setcontainsall([1, 2], ['1', '2'])",
|
|
"select setcontainsany([1, 2], ['1', '2'])",
|
|
),
|
|
ExpErr: "types 'id' and 'string' are not equatable",
|
|
},
|
|
},
|
|
}
|
|
|
|
// test IDSetQ and StringSetQ functions
|
|
var setTimeQuantumTests = TableTest{
|
|
name: "selectwithsetqliterals",
|
|
Table: tbl(
|
|
"selectwithsetqliterals",
|
|
srcHdrs(
|
|
srcHdr("_id", fldTypeID),
|
|
srcHdr("a", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("b", fldTypeInt, "min 0", "max 1000"),
|
|
srcHdr("ssq1", fldTypeStringSetQ, "timequantum 'YMD'"),
|
|
srcHdr("isq1", fldTypeIDSetQ, "timequantum 'YMD'"),
|
|
),
|
|
),
|
|
SQLTests: []SQLTest{
|
|
// can't find example syntax or docs for how to put time quantum fields in with srcRow()
|
|
// so i'm inserting them with SQL statements.
|
|
{
|
|
SQLs: sqls(
|
|
"insert into selectwithsetqliterals(_id, a, b, ssq1, isq1) values (1, 10, 100, {'2022-01-03T00:00:00Z', ['foo']}, {'2022-01-01T00:00:00Z', [99, 101]})",
|
|
"insert into selectwithsetqliterals(_id, a, b, ssq1, isq1) values (2, 20, 200, {'2022-01-03T00:00:00Z', ['bar']}, {'2022-01-01T00:00:00Z', [100]})",
|
|
"insert into selectwithsetqliterals(_id, a, b, ssq1, isq1) values (3, 30, 300, {'2022-01-03T00:00:00Z', ['foo', 'bar']}, {'2022-01-01T00:00:00Z', [101]})",
|
|
),
|
|
ExpHdrs: hdrs(),
|
|
ExpRows: rows(),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsSelectList
|
|
name: "set-contains-select-list",
|
|
SQLs: sqls(
|
|
"select _id, setcontains(ssq1, 'bar') from selectwithsetqliterals",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), false),
|
|
row(int64(2), true),
|
|
row(int64(3), true),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsSelectListInt
|
|
name: "set-contains-select-list-int",
|
|
SQLs: sqls(
|
|
"select _id, setcontains(isq1, 101) from selectwithsetqliterals",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), true),
|
|
row(int64(2), false),
|
|
row(int64(3), true),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
{
|
|
// SetContainsWithLiteral
|
|
// SetContainsWithLiteralInt
|
|
// SetContainsWithLiteralAny
|
|
// SetContainsWithLiteralAnyInt
|
|
// SetContainsWithLiteralAll
|
|
// SetContainsWithLiteralAllInt
|
|
name: "set-contains-with-literal",
|
|
SQLs: sqls(
|
|
"select _id, setcontains(['foo'], 'foo') from selectwithsetqliterals",
|
|
"select _id, setcontains([101], 101) from selectwithsetqliterals",
|
|
"select _id, setcontainsany(['foo'], ['foo']) from selectwithsetqliterals",
|
|
"select _id, setcontainsany([101], [101]) from selectwithsetqliterals",
|
|
"select _id, setcontainsall(['foo'], ['foo']) from selectwithsetqliterals",
|
|
"select _id, setcontainsall([101], [101]) from selectwithsetqliterals",
|
|
),
|
|
ExpHdrs: hdrs(
|
|
hdr("_id", fldTypeID),
|
|
hdr("", fldTypeBool),
|
|
),
|
|
ExpRows: rows(
|
|
row(int64(1), true),
|
|
row(int64(2), true),
|
|
row(int64(3), true),
|
|
),
|
|
Compare: CompareExactUnordered,
|
|
},
|
|
},
|
|
}
|