func TestUpdateMutations_AddField(t *testing.T) { log.Printf("In TestUpdateMutations_AddField()") var bucketName = "default" var indexName = "index_newField" var field = "newField" docsToCreate := generateDocs(1000, "users.prod") UpdateKVDocs(docsToCreate, docs) seed++ log.Printf("Setting JSON docs in KV") kvutility.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, field) scanResults, err := secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) log.Printf("Count of scan results before add field mutations: %d", len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Create mutations with add fields AddFieldMutations(300, field) // Update documents by adding the indexed field docScanResults = datautility.ExpectedScanAllResponse(docs, field) scanResults, err = secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) log.Printf("Count of scan results after add field mutations: %d", len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestMixedDatatypesRange_Float(t *testing.T) { log.Printf("In TestMixedDatatypesRange_Float()") field := "mixed_field" indexName := "index_mixeddt" bucketName := "default" e := secondaryindex.DropAllSecondaryIndexes(indexManagementAddress) FailTestIfError(e, "Error in DropAllSecondaryIndexes", t) docsToCreate := generateJSONSMixedDatatype(1000, field) seed++ log.Printf("Setting mixed datatypes JSON docs in KV") kvutility.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_float64(docs, field, 100, 1000, 3) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{100}, []interface{}{1000}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Lengths of expected and actual scan results are: %d and %d", len(docScanResults), len(scanResults)) docScanResults = datautility.ExpectedScanResponse_float64(docs, field, 1, 100, 2) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{1}, []interface{}{100}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Lengths of expected and actual scan results are: %d and %d", len(docScanResults), len(scanResults)) log.Printf("Length of kv docs is %d", len(docs)) }
// Test case for testing secondary key field values as very huge func TestLargeSecondaryKeyLength(t *testing.T) { log.Printf("In TestLargeSecondaryKeyLength()") field := "LongSecField" indexName := "index_LongSecField" bucketName := "default" e := secondaryindex.DropAllSecondaryIndexes(indexManagementAddress) FailTestIfError(e, "Error in DropAllSecondaryIndexes", t) largeKeyDocs := generateLargeSecondayKeyDocs(1000, field) seed++ log.Printf("Setting JSON docs in KV") kvutility.SetKeyValues(largeKeyDocs, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, field) scanResults, err := secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) log.Printf("ScanAll: Lengths of expected and actual scan results are: %d and %d", len(docScanResults), len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) docScanResults = datautility.ExpectedScanResponse_string(docs, field, "A", "zzzz", 3) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"A"}, []interface{}{"zzzz"}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) log.Printf("Range: Lengths of expected and actual scan results are: %d and %d", len(docScanResults), len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("End: Length of kv docs is %d", len(docs)) }
func TestCreate2Drop1Scan2(t *testing.T) { log.Printf("In TestCreate2Drop1Scan2()") var index1 = "index_i1" var index2 = "index_i2" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(index1, bucketName, indexManagementAddress, "", []string{"company"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) err = secondaryindex.CreateSecondaryIndex(index2, bucketName, indexManagementAddress, "", []string{"age"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, "company", "FI", "SR", 1) scanResults, err := secondaryindex.Range(index1, bucketName, indexScanAddress, []interface{}{"FI"}, []interface{}{"SR"}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 1", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) docScanResults = datautility.ExpectedScanResponse_float64(docs, "age", 30, 50, 1) scanResults, err = secondaryindex.Range(index2, bucketName, indexScanAddress, []interface{}{30}, []interface{}{50}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 2", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) err = secondaryindex.DropSecondaryIndex(index1, bucketName, indexManagementAddress) docScanResults = datautility.ExpectedScanResponse_float64(docs, "age", 0, 60, 1) scanResults, err = secondaryindex.Range(index2, bucketName, indexScanAddress, []interface{}{0}, []interface{}{60}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 2", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
// Test with mutations delay wait of 15s func TestUpdateDocsMutation(t *testing.T) { log.Printf("In TestUpdateDocsMutation()") var indexName = "index_age" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"age"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_float64(docs, "age", 20, 40, 2) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{20}, []interface{}{40}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) log.Printf("Len of expected and actual scan results are : %d and %d", len(docScanResults), len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) //Update docs mutations: Update docs in KV UpdateDocs(100) docScanResults = datautility.ExpectedScanResponse_float64(docs, "age", 20, 40, 2) start := time.Now() scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{20}, []interface{}{40}, 2, true, defaultlimit, c.SessionConsistency, nil) elapsed := time.Since(start) log.Printf("Index Scan after mutations took %s\n", elapsed) FailTestIfError(err, "Error in scan", t) log.Printf("Len of expected and actual scan results are : %d and %d", len(docScanResults), len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestSameIndexNameInTwoBuckets(t *testing.T) { log.Printf("In TestSameIndexNameInTwoBuckets()") e := secondaryindex.DropAllSecondaryIndexes(indexManagementAddress) FailTestIfError(e, "Error in DropAllSecondaryIndexes", t) numOfBuckets := 2 indexName := "b_idx" indexFields := [...]string{"age", "address.city"} bucketNames := [...]string{"default", "buck2"} proxyPorts := [...]string{"11212", "11213"} var bucketDocs [2]tc.KeyValues // Update default bucket ram to 256 // Create two more buckets with ram 256 each // Add different docs to all 3 buckets // Create index on each of them // Query the indexes kvutility.FlushBucket(bucketNames[0], "", clusterconfig.Username, clusterconfig.Password, kvaddress) kvutility.EditBucket(bucketNames[0], "", clusterconfig.Username, clusterconfig.Password, kvaddress, "256") for i := 1; i < numOfBuckets; i++ { kvutility.CreateBucket(bucketNames[i], "sasl", "", clusterconfig.Username, clusterconfig.Password, kvaddress, "256", proxyPorts[i]) } time.Sleep(30 * time.Second) log.Printf("Generating docs and Populating all the buckets") for i := 0; i < numOfBuckets; i++ { bucketDocs[i] = generateDocs(1000, "users.prod") kvutility.SetKeyValues(bucketDocs[i], bucketNames[i], "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketNames[i], indexManagementAddress, "", []string{indexFields[i]}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) } time.Sleep(3 * time.Second) // Scan index of first bucket docScanResults := datautility.ExpectedScanResponse_float64(bucketDocs[0], indexFields[0], 30, 50, 1) scanResults, err := secondaryindex.Range(indexName, bucketNames[0], indexScanAddress, []interface{}{30}, []interface{}{50}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 1", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan index of second bucket docScanResults = datautility.ExpectedScanResponse_string(bucketDocs[1], indexFields[1], "F", "Q", 2) scanResults, err = secondaryindex.Range(indexName, bucketNames[1], indexScanAddress, []interface{}{"F"}, []interface{}{"Q"}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 2", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) kvutility.EditBucket(bucketNames[0], "", clusterconfig.Username, clusterconfig.Password, kvaddress, "512") kvutility.DeleteBucket(bucketNames[1], "", clusterconfig.Username, clusterconfig.Password, kvaddress) time.Sleep(30 * time.Second) // Sleep after bucket create or delete tc.ClearMap(docs) UpdateKVDocs(bucketDocs[0], docs) }
// Test with large number of mutations func TestLargeMutations(t *testing.T) { log.Printf("In TestLargeMutations()") var index1 = "indexmut_1" var index2 = "indexmut_2" var bucketName = "default" var field1 = "company" var field2 = "gender" e := secondaryindex.DropAllSecondaryIndexes(indexManagementAddress) FailTestIfError(e, "Error in DropAllSecondaryIndexes", t) docsToCreate := generateDocs(20000, "users.prod") UpdateKVDocs(docsToCreate, docs) kv.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(index1, bucketName, indexManagementAddress, "", []string{field1}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, field1) scanResults, err := secondaryindex.ScanAll(index1, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Len of expected and actual scan results are : %d and %d", len(docScanResults), len(scanResults)) for i := 0; i <= 10; i++ { log.Printf("ITERATION %v\n", i) docsToCreate = generateDocs(10000, "users.prod") UpdateKVDocs(docsToCreate, docs) kv.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(index2, bucketName, indexManagementAddress, "", []string{field2}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults = datautility.ExpectedScanAllResponse(docs, field1) scanResults, err = secondaryindex.ScanAll(index1, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Len of expected and actual scan results are : %d and %d", len(docScanResults), len(scanResults)) docScanResults = datautility.ExpectedScanAllResponse(docs, field2) scanResults, err = secondaryindex.ScanAll(index2, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Len of expected and actual scan results are : %d and %d", len(docScanResults), len(scanResults)) err = secondaryindex.DropSecondaryIndex(index2, bucketName, indexManagementAddress) FailTestIfError(err, "Error in drop index", t) } }
func TestCreateDropCreate(t *testing.T) { log.Printf("In TestCreateDropCreate()") var indexName = "index_cdc" var bucketName = "default" // Create an index err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"company"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) // Scan after index create docScanResults := datautility.ExpectedScanResponse_string(docs, "company", "FI", "SR", 2) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"FI"}, []interface{}{"SR"}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 1: ", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan 1 result validation: ", t) // Drop the created index err = secondaryindex.DropSecondaryIndex(indexName, bucketName, indexManagementAddress) // Scan after dropping the index. Error expected docScanResults = datautility.ExpectedScanResponse_string(docs, "company", "BIOSPAN", "ZILLANET", 0) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"BIOSPAN"}, []interface{}{"ZILLANET"}, 0, true, defaultlimit, c.SessionConsistency, nil) if err == nil { t.Fatal("Scan 2: Error excpected when scanning for dropped index but scan didnt fail \n") } else { log.Printf("Scan 2 failed as expected with error: %v\n", err) } // Create the same index again err = secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"company"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) // Scan the created index with inclusion 1 docScanResults = datautility.ExpectedScanResponse_string(docs, "company", "FI", "SR", 1) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"FI"}, []interface{}{"SR"}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 3: ", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan 3 result validation: ", t) log.Printf("(Inclusion 1) Lengths of expected and actual scan results are %d and %d. Num of docs in bucket = %d", len(docScanResults), len(scanResults), len(docs)) // Scan the created index with inclusion 3 docScanResults = datautility.ExpectedScanResponse_string(docs, "company", "FI", "SR", 3) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"FI"}, []interface{}{"SR"}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 4: ", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan 4 result validation: ", t) log.Printf("(Inclusion 3) Lengths of expected and actual scan results are %d and %d. Num of docs in bucket = %d", len(docScanResults), len(scanResults), len(docs)) }
func TestMixedDatatypesScanAll(t *testing.T) { log.Printf("In TestMixedDatatypesScanAll()") log.Printf("Before test begin: Length of kv docs is %d", len(docs)) field := "md_street" indexName := "index_mixeddt" bucketName := "default" e := secondaryindex.DropAllSecondaryIndexes(indexManagementAddress) FailTestIfError(e, "Error in DropAllSecondaryIndexes", t) docsToCreate := generateJSONSMixedDatatype(1000, "md_street") log.Printf("After generate docs: Length of kv docs is %d", len(docs)) seed++ log.Printf("Setting mixed datatypes JSON docs in KV") kvutility.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, field) scanResults, err := secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Lengths of expected and actual scan results are: %d and %d", len(docScanResults), len(scanResults)) log.Printf("End: Length of kv docs is %d", len(docs)) }
func TestLookupJsonObject(t *testing.T) { log.Printf("In TestLookupJsonObject()") var indexName = "index_streetaddress" var bucketName = "default" addDocIfNotPresentInKV("User3bf51f08-0bac-4c03-bcec-5c255cbdde2c") addDocIfNotPresentInKV("Userbb48952f-f8d1-4e04-a0e1-96b9019706fb") time.Sleep(2 * time.Second) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"address.streetaddress"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) value := map[string]interface{}{ "doornumber": "12B", "floor": 5.0, "buildingname": "Sterling Heights", "streetname": "Hill Street"} docScanResults := datautility.ExpectedLookupResponse_json(docs, "address.streetaddress", value) scanResults, err := secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{value}, true, defaultlimit, c.SessionConsistency, nil) tc.PrintScanResults(docScanResults, "docScanResults") tc.PrintScanResults(scanResults, "scanResults") FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestIndexNameValidation(t *testing.T) { log.Printf("In TestIndexNameValidation()") var bucketName = "default" var validIndexName = "#primary-Index_test" var invalidIndexName = "ÌñÐÉx&(abc_%" var field = "balance" docsToCreate := generateDocs(1000, "users.prod") UpdateKVDocs(docsToCreate, docs) seed++ log.Printf("Setting JSON docs in KV") kvutility.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(invalidIndexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) errMsg := "Expected index name validation error for index " + invalidIndexName FailTestIfNoError(err, errMsg, t) log.Printf("Creation of index with invalid name %v failed as expected", invalidIndexName) err = secondaryindex.CreateSecondaryIndex(validIndexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, field, "$4", "$7", 3) scanResults, err := secondaryindex.Range(validIndexName, bucketName, indexScanAddress, []interface{}{"$4"}, []interface{}{"$7"}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestLargeDocumentSize(t *testing.T) { log.Printf("In TestLargeDocumentSize()") u, _ := user.Current() datapath := filepath.Join(u.HomeDir, "testdata/TwitterFeed1.txt.gz") tc.DownloadDataFile(tc.IndexTypesTwitterFeed1JSONDataS3, datapath, true) largeDocs := datautility.LoadJSONFromCompressedFile(datapath, "id_str") UpdateKVDocs(largeDocs, docs) log.Printf("Length of docs and largeDocs = %d and %d", len(docs), len(largeDocs)) bucketName := "default" index1 := "index_userscreenname" kvutility.SetKeyValues(largeDocs, bucketName, "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(index1, bucketName, indexManagementAddress, "", []string{"`user`.screen_name"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, "user.screen_name") scanResults, err := secondaryindex.ScanAll(index1, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 1: ", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan 1: result validation", t) }
func TestSameFieldNameAtDifferentLevels(t *testing.T) { log.Printf("In TestSameFieldNameAtDifferentLevels()") var bucketName = "default" var indexName = "cityindex" var field = "city" docsToCreate := generateDocs(1000, "users.prod") UpdateKVDocs(docsToCreate, docs) docsToUpload := make(tc.KeyValues) for k, v := range docsToCreate { json := v.(map[string]interface{}) address := json["address"].(map[string]interface{}) city := address["city"].(string) json[field] = city address["city"] = "ThisIsNestedCity " + city docsToUpload[k] = json } seed++ log.Printf("Setting JSON docs in KV") kvutility.SetKeyValues(docsToUpload, "default", "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, field, "A", "K", 3) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"A"}, []interface{}{"K"}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestFieldsWithSpecialCharacters(t *testing.T) { log.Printf("In TestFieldsWithSpecialCharacters()") var bucketName = "default" var indexName = "index_specialchar" var field = "splfield" docsToCreate := generateDocsWithSpecialCharacters(1000, "users.prod", field) UpdateKVDocs(docsToCreate, docs) var valueToLookup string for _, v := range docsToCreate { json := v.(map[string]interface{}) valueToLookup = json[field].(string) break } kvutility.SetKeyValues(docsToCreate, bucketName, "", clusterconfig.KVAddress) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) log.Printf("Looking up for value %v", valueToLookup) docScanResults := datautility.ExpectedScanResponse_string(docs, field, valueToLookup, valueToLookup, 3) scanResults, err := secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{valueToLookup}, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestCompositeIndex_NumAndString(t *testing.T) { log.Printf("In TestCompositeIndex()") var bucketName = "default" var indexName = "index_composite1" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"age", "company"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) scanResults, err := secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) if len(scanResults) != len(docs) { log.Printf("ScanAll of composite index is wrong. Expected and actual num of results: %d and %d", len(docs), len(scanResults)) e := errors.New("ScanAll of composite index is wrong") FailTestIfError(e, "Error in TestCompositeIndex", t) } scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{25, "F"}, []interface{}{30, "M"}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) // todo: validate the results addDocIfNotPresentInKV("User22a44f1c-3f15-4ada-9cf5-6c24a7690a37") docScanResults := make(tc.ScanResponse) docScanResults["User22a44f1c-3f15-4ada-9cf5-6c24a7690a37"] = []interface{}{25.0, "ZIGGLES"} scanResults, err = secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{25, "ZIGGLES"}, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestThreeIndexCreates(t *testing.T) { log.Printf("In TestThreeIndexCreates()") var i1 = "index_balance" var i2 = "index_email" var i3 = "index_pin" var bucketName = "default" e := secondaryindex.CreateSecondaryIndex(i1, bucketName, indexManagementAddress, "", []string{"balance"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(e, "Error in creating the index", t) //Create docs mutations: Add new docs to KV log.Printf("Create docs mutations") CreateDocs(100) docScanResults := datautility.ExpectedScanResponse_string(docs, "balance", "$1", "$2", 2) scanResults, err := secondaryindex.Range(i1, bucketName, indexScanAddress, []interface{}{"$1"}, []interface{}{"$2"}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) err = secondaryindex.CreateSecondaryIndex(i2, bucketName, indexManagementAddress, "", []string{"email"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) //Create docs mutations: Add new docs to KV log.Printf("Create docs mutations") CreateDocs(100) docScanResults = datautility.ExpectedScanResponse_string(docs, "email", "p", "w", 1) scanResults, err = secondaryindex.Range(i2, bucketName, indexScanAddress, []interface{}{"p"}, []interface{}{"w"}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) err = secondaryindex.CreateSecondaryIndex(i3, bucketName, indexManagementAddress, "", []string{"address.pin"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) //Delete docs mutations: Delete docs from KV log.Printf("Delete docs mutations") DeleteDocs(150) docScanResults = datautility.ExpectedScanResponse_float64(docs, "address.pin", 2222, 5555, 3) scanResults, err = secondaryindex.Range(i3, bucketName, indexScanAddress, []interface{}{2222}, []interface{}{5555}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestUpdateMutations_DataTypeChange(t *testing.T) { log.Printf("In TestUpdateMutations_DataTypeChange()") var bucketName = "default" var indexName = "index_isUserActive" var field = "isActive" docsToCreate := generateDocs(1000, "users.prod") UpdateKVDocs(docsToCreate, docs) seed++ log.Printf("Setting JSON docs in KV") kvutility.SetKeyValues(docsToCreate, "default", "", clusterconfig.KVAddress) time.Sleep(2 * time.Second) err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{field}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, field) scanResults, err := secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Create mutations with delete fields DataTypeChangeMutations_BoolToString(200, field) // Update documents by changing datatype of the indexed field docScanResults = datautility.ExpectedScanAllResponse(docs, field) scanResults, err = secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) docScanResults = datautility.ExpectedScanResponse_string(docs, field, "true", "true", 3) scanResults, err = secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{"true"}, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) docScanResults = datautility.ExpectedScanResponse_string(docs, field, "false", "false", 3) scanResults, err = secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{"false"}, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
// Test for case sensitivity of index field values func TestSimpleIndex_FieldValueCaseSensitivity(t *testing.T) { log.Printf("In TestSimpleIndex_StringCaseSensitivity()") var indexName = "index_company" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"company"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, "company", "B", "C", 1) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"B"}, []interface{}{"C"}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 1", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) docScanResults = datautility.ExpectedScanResponse_string(docs, "company", "B", "c", 1) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"B"}, []interface{}{"c"}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan 2", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestScanAfterBucketPopulate(t *testing.T) { log.Printf("In TestScanAfterBucketPopulate()") log.Printf("Create an index on empty bucket, populate the bucket and Run a scan on the index") var indexName = "index_eyeColor" var bucketName = "default" docScanResults := datautility.ExpectedScanResponse_string(docs, "eyeColor", "b", "c", 3) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"b"}, []interface{}{"c"}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation: ", t) }
func TestIndexPartiallyMissingField(t *testing.T) { log.Printf("In TestIndexPartiallyMissingField()") var indexName = "index_nationality" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"nationality"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, "nationality", "A", "z", 1) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{"A"}, []interface{}{"z"}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestBasicLookup(t *testing.T) { log.Printf("In TestBasicLookup()") var indexName = "index_company" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"company"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, "company", "BIOSPAN", "BIOSPAN", 3) scanResults, err := secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{"BIOSPAN"}, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestNestedIndex_Float(t *testing.T) { log.Printf("In TestNestedIndex_Float()") var indexName = "index_floor" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"address.streetaddress.floor"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_float64(docs, "address.streetaddress.floor", 3, 6, 3) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{3}, []interface{}{6}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
// Test for single index field of data type bool func TestSimpleIndex_BoolDataType(t *testing.T) { log.Printf("In TestSimpleIndex_BoolDataType()") var indexName = "index_isActive" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"isActive"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_bool(docs, "isActive", true, 3) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{true}, []interface{}{true}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestIndexOnNonExistentField(t *testing.T) { log.Printf("In TestIndexOnNonExistentField()") var indexName = "index_height" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"height"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_float64(docs, "height", 6.0, 6.5, 1) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{6.0}, []interface{}{6.5}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestBasicArrayDataType_ScanAll(t *testing.T) { log.Printf("In TestBasicArrayDataType_ScanAll()") var indexName = "index_tags" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"tags"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanAllResponse(docs, "tags") scanResults, err := secondaryindex.ScanAll(indexName, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestIndexCreateWithWhere(t *testing.T) { log.Printf("In TestIndexCreateWithWhere()") var index1 = "index_ageabove30" var index2 = "index_ageteens" var index3 = "index_age35to45" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(index1, bucketName, indexManagementAddress, `age>30`, []string{"age"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_float64(docs, "age", 31, 40, 1) scanResults, err := secondaryindex.Range(index1, bucketName, indexScanAddress, []interface{}{31}, []interface{}{40}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Lengths of expected and actual scanReuslts are: %d and %d", len(scanResults), len(docScanResults)) err = secondaryindex.CreateSecondaryIndex(index2, bucketName, indexManagementAddress, `age > 12 AND age < 20`, []string{"age"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults = datautility.ExpectedScanResponse_float64(docs, "age", 12, 20, 0) scanResults, err = secondaryindex.Range(index2, bucketName, indexScanAddress, []interface{}{12}, []interface{}{20}, 0, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Lengths of expected and actual scanReuslts are: %d and %d", len(scanResults), len(docScanResults)) err = secondaryindex.CreateSecondaryIndex(index3, bucketName, indexManagementAddress, `age >= 35 AND age <= 45`, []string{"age"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults = datautility.ExpectedScanResponse_float64(docs, "age", 35, 45, 3) scanResults, err = secondaryindex.ScanAll(index3, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) log.Printf("Lengths of expected and actual scanReuslts are: %d and %d", len(scanResults), len(docScanResults)) }
func TestRangeFloatInclVariations(t *testing.T) { log.Printf("In TestRangeFloatInclVariations()") var indexName = "index_latitude" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"latitude"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) // Scan 1. Value close to -67.373265, Inclusion 0 log.Printf("Scan 1") docScanResults := datautility.ExpectedScanResponse_float64(docs, "latitude", -67.373365, -67.373165, 0) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{-67.373365}, []interface{}{-67.373165}, 0, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan 2. Value close to -67.373265, Inclusion 1 ( >= low && < high) (val < low && val < high : Expected 0 result) log.Printf("Scan 2") docScanResults = datautility.ExpectedScanResponse_float64(docs, "latitude", -67.3732649999, -67.373264, 1) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{-67.3732649999}, []interface{}{-67.373264}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan 3. Value close to -67.373265, Inclusion 2 ( > low && <= high) (val > low && val > high: Expect 0 result) log.Printf("Scan 3") docScanResults = datautility.ExpectedScanResponse_float64(docs, "latitude", -67.373265999, -67.37326500001, 2) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{-67.373265999}, []interface{}{-67.37326500001}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan 4. Value close to -67.373265, Inclusion 2 ( > low && <= high) ( val > low && val < high: Expect 1 result) log.Printf("Scan 4") docScanResults = datautility.ExpectedScanResponse_float64(docs, "latitude", -67.37326500001, -67.3732649999, 2) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{-67.37326500001}, []interface{}{-67.3732649999}, 2, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan 5. Value close to -67.373265, Inclusion 3 ( val == low && val < high : Expect 1 result) log.Printf("Scan 5") docScanResults = datautility.ExpectedScanResponse_float64(docs, "latitude", -67.373265, -67.3732649999, 3) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{-67.373265}, []interface{}{-67.3732649999}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan 6. Value close to -67.373265, Inclusion 3 ( val == low && val > high : Expect 0 results) log.Printf("Scan 6") docScanResults = datautility.ExpectedScanResponse_float64(docs, "latitude", -67.373265, -67.37326500001, 3) scanResults, err = secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{-67.373265}, []interface{}{-67.37326500001}, 3, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestRestartProjector(t *testing.T) { log.Printf("In TestRestartProjector()") tc.KillProjector() time.Sleep(60 * time.Second) var indexName = "index_age" var bucketName = "default" docScanResults := datautility.ExpectedScanResponse_float64(docs, "age", 0, 90, 1) scanResults, err := secondaryindex.Range(indexName, bucketName, indexScanAddress, []interface{}{0}, []interface{}{90}, 1, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) log.Printf("Len of expected and actual scan results are : %d and %d", len(docScanResults), len(scanResults)) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestScanAllNestedField(t *testing.T) { log.Printf("In TestScanAllNestedField()") var index1 = "index_streetname" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(index1, bucketName, indexManagementAddress, "", []string{"address.streetaddress.streetname"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedScanResponse_string(docs, "address.streetaddress.streetname", "A", "z", 3) log.Printf("Length of docScanResults = %d", len(docScanResults)) scanResults, err := secondaryindex.ScanAll(index1, bucketName, indexScanAddress, defaultlimit, c.SessionConsistency, nil) log.Printf("Length of scanResults = %d", len(scanResults)) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) }
func TestBasicNullDataType(t *testing.T) { log.Printf("In TestBasicNullDataType()") var indexName = "index_email" var bucketName = "default" err := secondaryindex.CreateSecondaryIndex(indexName, bucketName, indexManagementAddress, "", []string{"email"}, false, nil, true, defaultIndexActiveTimeout, nil) FailTestIfError(err, "Error in creating the index", t) docScanResults := datautility.ExpectedLookupResponse_nil(docs, "email") scanResults, err := secondaryindex.Lookup(indexName, bucketName, indexScanAddress, []interface{}{nil}, true, defaultlimit, c.SessionConsistency, nil) FailTestIfError(err, "Error in scan", t) err = tv.Validate(docScanResults, scanResults) FailTestIfError(err, "Error in scan result validation", t) // Scan all should include null : todo }