SemanticSearchPOC / test /acceptance /graphql_resolvers /local_aggregate_matrix_setup_test.go
KevinStephenson
Adding in weaviate code
b110593
raw
history blame
27.9 kB
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
package test
import (
"fmt"
"time"
"github.com/weaviate/weaviate/entities/models"
"github.com/weaviate/weaviate/entities/schema"
graphqlhelper "github.com/weaviate/weaviate/test/helper/graphql"
)
const notExistingObjectId = "cfa3b21e-ca5f-4db7-a412-ffffffffffff"
const (
arrayClassName = "ArrayClass"
objectArrayClassID1_4el = "cfa3b21e-ca5f-4db7-a412-5fc6a23c534a"
objectArrayClassID2_3el = "cfa3b21e-ca5f-4db7-a412-5fc6a23c534b"
objectArrayClassID3_2el = "cfa3b21e-ca5f-4db7-a412-5fc6a23c535a"
objectArrayClassID4_1el = "cfa3b21e-ca5f-4db7-a412-5fc6a23c535b"
objectArrayClassID5_0el = "cfa3b21e-ca5f-4db7-a412-5fc6a23c536a"
objectArrayClassID6_nils = "cfa3b21e-ca5f-4db7-a412-5fc6a23c536b"
objectArrayClassID7_empty = "cfa3b21e-ca5f-4db7-a412-5fc6a23c536c"
)
const (
noPropsClassName = "ClassWithoutProperties"
objectNoPropsClassID1 = "dfa3b21e-ca5f-4db7-a412-5fc6a23c5301"
objectNoPropsClassID2 = "dfa3b21e-ca5f-4db7-a412-5fc6a23c5311"
)
const (
cityClassName = "City"
)
const (
duplicatesClassName = "DuplicatesClass"
objectDuplicatesClassID1_4el = "a8076f34-ec16-4333-a963-00c89c5ba001"
objectDuplicatesClassID2_3el = "a8076f34-ec16-4333-a963-00c89c5ba002"
objectDuplicatesClassID3_2el = "a8076f34-ec16-4333-a963-00c89c5ba003"
)
func arrayClassSchema() *models.Class {
return &models.Class{
Class: arrayClassName,
ModuleConfig: map[string]interface{}{
"text2vec-contextionary": map[string]interface{}{
"vectorizeClassName": true,
},
},
InvertedIndexConfig: &models.InvertedIndexConfig{IndexPropertyLength: true, IndexNullState: true},
Properties: []*models.Property{
{
Name: "texts",
DataType: schema.DataTypeTextArray.PropString(),
Tokenization: models.PropertyTokenizationWord,
},
{
Name: "numbers",
DataType: []string{"number[]"},
},
{
Name: "ints",
DataType: []string{"int[]"},
},
{
Name: "booleans",
DataType: []string{"boolean[]"},
},
{
Name: "datesAsStrings",
DataType: []string{"date[]"},
},
{
Name: "dates",
DataType: []string{"date[]"},
},
},
}
}
func arrayClassObjects() []*models.Object {
return []*models.Object{
objectArrayClass4el(),
objectArrayClass3el(),
objectArrayClass2el(),
objectArrayClass1el(),
objectArrayClass0el(),
objectArrayClassNils(),
objectArrayClassEmpty(),
}
}
func objectArrayClass4el() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID1_4el,
Properties: map[string]interface{}{
"texts": []string{"Atxt", "Btxt", "Ctxt", "Dtxt"},
"numbers": []float64{1.0, 2.0, 3.0, 4.0},
"ints": []int{101, 102, 103, 104},
"booleans": []bool{true, true, true, false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
"2022-06-02T22:18:59.640162Z",
"2023-06-03T22:18:59.640162Z",
"2024-06-04T22:18:59.640162Z",
},
"dates": []time.Time{
time.Date(2001, 6, 1, 12, 0, 0, 0, time.UTC),
time.Date(2002, 6, 2, 12, 0, 0, 0, time.UTC),
time.Date(2003, 6, 3, 12, 0, 0, 0, time.UTC),
time.Date(2004, 6, 4, 12, 0, 0, 0, time.UTC),
},
},
}
}
func objectArrayClass3el() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID2_3el,
Properties: map[string]interface{}{
"texts": []string{"Atxt", "Btxt", "Ctxt"},
"numbers": []float64{1.0, 2.0, 3.0},
"ints": []int{101, 102, 103},
"booleans": []bool{true, true, false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
"2022-06-02T22:18:59.640162Z",
"2023-06-03T22:18:59.640162Z",
},
"dates": []time.Time{
time.Date(2001, 6, 1, 12, 0, 0, 0, time.UTC),
time.Date(2002, 6, 2, 12, 0, 0, 0, time.UTC),
time.Date(2003, 6, 3, 12, 0, 0, 0, time.UTC),
},
},
}
}
func objectArrayClass2el() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID3_2el,
Properties: map[string]interface{}{
"texts": []string{"Atxt", "Btxt"},
"numbers": []float64{1.0, 2.0},
"ints": []int{101, 102},
"booleans": []bool{true, false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
"2022-06-02T22:18:59.640162Z",
},
"dates": []time.Time{
time.Date(2001, 6, 1, 12, 0, 0, 0, time.UTC),
time.Date(2002, 6, 2, 12, 0, 0, 0, time.UTC),
},
},
}
}
func objectArrayClass1el() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID4_1el,
Properties: map[string]interface{}{
"texts": []string{"Atxt"},
"numbers": []float64{1.0},
"ints": []int{101},
"booleans": []bool{false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
},
"dates": []time.Time{
time.Date(2001, 6, 1, 12, 0, 0, 0, time.UTC),
},
},
}
}
func objectArrayClass0el() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID5_0el,
Properties: map[string]interface{}{
"texts": []string{},
"numbers": []float64{},
"ints": []int{},
"booleans": []bool{},
"datesAsStrings": []string{},
"dates": []time.Time{},
},
}
}
func objectArrayClassNils() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID6_nils,
Properties: map[string]interface{}{
"texts": nil,
"numbers": nil,
"ints": nil,
"booleans": nil,
"datesAsStrings": nil,
"dates": nil,
},
}
}
func objectArrayClassEmpty() *models.Object {
return &models.Object{
Class: arrayClassName,
ID: objectArrayClassID7_empty,
}
}
func aggregateArrayClassQuery(filters, groupBy string) string {
query := `{
Aggregate {
%s
%s
{
meta{
count
}
booleans{
count
type
totalTrue
totalFalse
percentageTrue
percentageFalse
}
texts{
count
type
topOccurrences {
value
occurs
}
}
numbers{
count
type
minimum
maximum
mean
median
mode
sum
}
ints{
count
type
minimum
maximum
mean
median
mode
sum
}
datesAsStrings{
count
}
dates{
count
}
%s
}
}
}`
params := ""
if filters != "" || groupBy != "" {
params = fmt.Sprintf(
`(
%s
%s
)`, filters, groupBy)
}
groupedBy := ""
if groupBy != "" {
groupedBy = `groupedBy{
value
path
}`
}
return fmt.Sprintf(query, arrayClassName, params, groupedBy)
}
func extractAggregateResult(result *graphqlhelper.GraphQLResult, className string) []interface{} {
return result.Get("Aggregate", className).AsSlice()
}
func noPropsClassSchema() *models.Class {
return &models.Class{
Class: noPropsClassName,
ModuleConfig: map[string]interface{}{
"text2vec-contextionary": map[string]interface{}{
"vectorizeClassName": true,
},
},
}
}
func noPropsClassObjects() []*models.Object {
return []*models.Object{
objectNoPropsClass1(),
objectNoPropsClass2(),
}
}
func objectNoPropsClass1() *models.Object {
return &models.Object{
Class: noPropsClassName,
ID: objectNoPropsClassID1,
}
}
func objectNoPropsClass2() *models.Object {
return &models.Object{
Class: noPropsClassName,
ID: objectNoPropsClassID2,
}
}
func aggregateNoPropsQuery(filters string) string {
query := `
{
Aggregate {
%s
%s
{
meta{
count
}
}
}
}
`
params := ""
if filters != "" {
params = fmt.Sprintf(
`(
%s
)`, filters)
}
return fmt.Sprintf(query, noPropsClassName, params)
}
func aggregateCityQuery(filters, groupBy string) string {
query := `{
Aggregate {
%s
%s
{
meta {
count
}
name {
count
type
topOccurrences {
value
occurs
}
}
cityArea {
count
type
minimum
maximum
mean
median
mode
sum
}
isCapital {
count
type
totalTrue
totalFalse
percentageTrue
percentageFalse
}
population {
count
type
minimum
maximum
mean
median
mode
sum
}
cityRights {
count
}
history {
count
type
topOccurrences {
value
occurs
}
}
museums {
count
type
topOccurrences {
value
occurs
}
}
timezones {
count
type
topOccurrences {
value
occurs
}
}
inCountry {
pointingTo
type
}
%s
}
}
}`
params := ""
if filters != "" || groupBy != "" {
params = fmt.Sprintf(
`(
%s
%s
)`, filters, groupBy)
}
groupedBy := ""
if groupBy != "" {
groupedBy = `groupedBy{
value
path
}`
}
return fmt.Sprintf(query, cityClassName, params, groupedBy)
}
func duplicatesClassSchema() *models.Class {
return &models.Class{
Class: duplicatesClassName,
ModuleConfig: map[string]interface{}{
"text2vec-contextionary": map[string]interface{}{
"vectorizeClassName": true,
},
},
Properties: []*models.Property{
{
Name: "texts",
DataType: schema.DataTypeTextArray.PropString(),
Tokenization: models.PropertyTokenizationWord,
},
{
Name: "numbers",
DataType: []string{"number[]"},
},
{
Name: "ints",
DataType: []string{"int[]"},
},
{
Name: "booleans",
DataType: []string{"boolean[]"},
},
{
Name: "datesAsStrings",
DataType: []string{"date[]"},
},
},
}
}
func duplicatesClassObjects() []*models.Object {
return []*models.Object{
objectDuplicatesClass4el(),
objectDuplicatesClass3el(),
objectDuplicatesClass2el(),
}
}
func objectDuplicatesClass4el() *models.Object {
return &models.Object{
Class: duplicatesClassName,
ID: objectDuplicatesClassID1_4el,
Properties: map[string]interface{}{
"texts": []string{"Atxt", "Atxt", "Atxt", "Btxt"},
"numbers": []float64{1.0, 1.0, 1.0, 2.0},
"ints": []int{101, 101, 101, 102},
"booleans": []bool{true, true, true, false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
"2021-06-01T22:18:59.640162Z",
"2021-06-01T22:18:59.640162Z",
"2022-06-02T22:18:59.640162Z",
},
},
}
}
func objectDuplicatesClass3el() *models.Object {
return &models.Object{
Class: duplicatesClassName,
ID: objectDuplicatesClassID2_3el,
Properties: map[string]interface{}{
"texts": []string{"Atxt", "Atxt", "Btxt"},
"numbers": []float64{1.0, 1.0, 2.0},
"ints": []int{101, 101, 102},
"booleans": []bool{true, true, false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
"2021-06-01T22:18:59.640162Z",
"2022-06-02T22:18:59.640162Z",
},
},
}
}
func objectDuplicatesClass2el() *models.Object {
return &models.Object{
Class: duplicatesClassName,
ID: objectDuplicatesClassID3_2el,
Properties: map[string]interface{}{
"texts": []string{"Atxt", "Btxt"},
"numbers": []float64{1.0, 2.0},
"ints": []int{101, 102},
"booleans": []bool{true, false},
"datesAsStrings": []string{
"2021-06-01T22:18:59.640162Z",
"2022-06-02T22:18:59.640162Z",
},
},
}
}
func aggregateDuplicatesClassQuery(filters, groupBy string) string {
query := `{
Aggregate {
%s
%s
{
meta{
count
}
booleans{
count
type
totalTrue
totalFalse
percentageTrue
percentageFalse
}
texts{
count
type
topOccurrences {
value
occurs
}
}
numbers{
count
type
minimum
maximum
mean
median
mode
sum
}
ints{
count
type
minimum
maximum
mean
median
mode
sum
}
datesAsStrings{
count
}
%s
}
}
}`
params := ""
if filters != "" || groupBy != "" {
params = fmt.Sprintf(
`(
%s
%s
)`, filters, groupBy)
}
groupedBy := ""
if groupBy != "" {
groupedBy = `groupedBy{
value
path
}`
}
return fmt.Sprintf(query, duplicatesClassName, params, groupedBy)
}
type aggregateTestCase struct {
name string
filters string
groupedAssertions map[string][]assertFunc // map[groupedBy]assertionsForGroup
}
type aggregateArrayClassTestCases struct{}
func (tc *aggregateArrayClassTestCases) WithoutFilters(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "without filters",
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (all results)",
filters: `
where: {
operator: Like
path: ["id"]
valueText: "*"
}`,
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereFilter_ResultsWithData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (results with data)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, objectArrayClassID1_4el[:35]+"?"),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereFilter_ResultsWithoutData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (results without data)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, objectArrayClassID5_0el[:35]+"?"),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereFilter_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, notExistingObjectId),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithNearObjectFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (all results)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 0.1
}`, objectArrayClassID1_4el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithNearObjectFilter_ResultsWithData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (results with data)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 0.988
}`, objectArrayClassID1_4el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithNearObjectFilter_ResultsWithoutData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (results without data)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 1
}`, objectArrayClassID5_0el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereAndNearObjectFilters_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (all results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "*"
}
nearObject: {
id: "%s"
certainty: 0.1
}`, objectArrayClassID1_4el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereAndNearObjectFilters_ResultsWithData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (results with data)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 0.98
}`, objectArrayClassID1_4el[:35]+"?", objectArrayClassID1_4el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereAndNearObjectFilters_ResultsWithoutData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (results without data)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 1
}`, objectArrayClassID5_0el[:35]+"?", objectArrayClassID5_0el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateArrayClassTestCases) WithWhereAndNearObjectFilters_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 0.1
}`, notExistingObjectId, objectArrayClassID1_4el),
groupedAssertions: groupedAssertions,
}
}
type aggregateNoPropsClassTestCases struct{}
func (tc *aggregateNoPropsClassTestCases) WithoutFilters(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "without filters",
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithWhereFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (all results)",
filters: `
where: {
operator: Like
path: ["id"]
valueText: "*"
}`,
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithWhereFilter_SomeResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (some results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, objectNoPropsClassID1[:35]+"?"),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithWhereFilter_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, notExistingObjectId),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithNearObjectFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (all results)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 0.1
}`, objectNoPropsClassID1),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithWhereAndNearObjectFilters_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (all results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "*"
}
nearObject: {
id: "%s"
certainty: 0.1
}`, objectNoPropsClassID1),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithWhereAndNearObjectFilters_SomeResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (some results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 1
}`, objectNoPropsClassID1[:35]+"?", objectNoPropsClassID1),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateNoPropsClassTestCases) WithWhereAndNearObjectFilters_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 0.1
}`, notExistingObjectId, objectNoPropsClassID1),
groupedAssertions: groupedAssertions,
}
}
type aggregateCityTestCases struct{}
func (tc *aggregateCityTestCases) WithoutFilters(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "without filters",
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (all results)",
filters: `
where: {
operator: Like
path: ["id"]
valueText: "*"
}`,
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereFilter_ResultsWithData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (results with data)",
filters: `
where: {
operator: Equal,
path: ["isCapital"],
valueBoolean: true
}`,
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereFilter_ResultsWithoutData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (results without data)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, nullisland),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereFilter_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, notExistingObjectId),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithNearObjectFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (all results)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 0.1
}`, berlin),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithNearObjectFilter_ResultsWithData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (results with data)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 0.81
}`, berlin),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithNearObjectFilter_ResultsWithoutData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with nearObject filter (results without data)",
filters: fmt.Sprintf(`
nearObject: {
id: "%s"
certainty: 0.9
}`, nullisland),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereAndNearObjectFilters_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (all results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "*"
}
nearObject: {
id: "%s"
certainty: 0.1
}`, berlin),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereAndNearObjectFilters_ResultsWithData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (results with data)",
filters: fmt.Sprintf(`
where: {
operator: Equal,
path: ["isCapital"],
valueBoolean: true
}
nearObject: {
id: "%s"
certainty: 0.81
}`, berlin),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereAndNearObjectFilters_ResultsWithoutData(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (results without data)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 0.9
}`, nullisland, nullisland),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateCityTestCases) WithWhereAndNearObjectFilters_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where & nearObject filters (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}
nearObject: {
id: "%s"
certainty: 0.1
}`, notExistingObjectId, berlin),
groupedAssertions: groupedAssertions,
}
}
type aggregateDuplicatesClassTestCases struct{}
func (tc *aggregateDuplicatesClassTestCases) WithoutFilters(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "without filters",
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateDuplicatesClassTestCases) WithWhereFilter_AllResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (all results)",
filters: `
where: {
operator: Like
path: ["id"]
valueText: "*"
}`,
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateDuplicatesClassTestCases) WithWhereFilter_SomeResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (some results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, objectDuplicatesClassID1_4el),
groupedAssertions: groupedAssertions,
}
}
func (tc *aggregateDuplicatesClassTestCases) WithWhereFilter_NoResults(groupedAssertions map[string][]assertFunc) aggregateTestCase {
return aggregateTestCase{
name: "with where filter (no results)",
filters: fmt.Sprintf(`
where: {
operator: Like
path: ["id"]
valueText: "%s"
}`, notExistingObjectId),
groupedAssertions: groupedAssertions,
}
}