1// Copyright 2013-2020 Aerospike, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package aerospike_test
16
17import (
18	"math"
19	"math/rand"
20
21	as "github.com/aerospike/aerospike-client-go"
22	// . "github.com/aerospike/aerospike-client-go/logger"
23	ast "github.com/aerospike/aerospike-client-go/types"
24
25	// . "github.com/aerospike/aerospike-client-go/utils/buffer"
26
27	. "github.com/onsi/ginkgo"
28	. "github.com/onsi/gomega"
29)
30
31// ALL tests are isolated by SetName and Key, which are 50 random characters
32var _ = Describe("Index operations test", func() {
33
34	Describe("Index creation", func() {
35		var err error
36		var ns = *namespace
37		var set = randString(50)
38		var key *as.Key
39		var wpolicy = as.NewWritePolicy(0, 0)
40
41		const keyCount = 1000
42		bin1 := as.NewBin("Aerospike1", rand.Intn(math.MaxInt16))
43		bin2 := as.NewBin("Aerospike2", randString(100))
44
45		BeforeEach(func() {
46			for i := 0; i < keyCount; i++ {
47				key, err = as.NewKey(ns, set, randString(50))
48				Expect(err).ToNot(HaveOccurred())
49
50				err = client.PutBins(wpolicy, key, bin1, bin2)
51				Expect(err).ToNot(HaveOccurred())
52			}
53		})
54
55		Context("Create non-existing index", func() {
56
57			It("must create an Index", func() {
58				idxTask, err := client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING)
59				Expect(err).ToNot(HaveOccurred())
60				defer client.DropIndex(wpolicy, ns, set, set+bin1.Name)
61
62				// wait until index is created
63				<-idxTask.OnComplete()
64
65				// no duplicate index is allowed
66				_, err = client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING)
67				Expect(err).To(HaveOccurred())
68				Expect(err.(ast.AerospikeError).ResultCode()).To(Equal(ast.INDEX_FOUND))
69			})
70
71			It("must drop an Index", func() {
72				idxTask, err := client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING)
73				Expect(err).ToNot(HaveOccurred())
74
75				// wait until index is created
76				<-idxTask.OnComplete()
77
78				err = client.DropIndex(wpolicy, ns, set, set+bin1.Name)
79				Expect(err).ToNot(HaveOccurred())
80
81				err = client.DropIndex(wpolicy, ns, set, set+bin1.Name)
82				Expect(err).ToNot(HaveOccurred())
83			})
84
85			It("must drop an Index, and recreate it again to verify", func() {
86				idxTask, err := client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING)
87				Expect(err).ToNot(HaveOccurred())
88
89				// wait until index is created
90				Expect(<-idxTask.OnComplete()).ToNot(HaveOccurred())
91
92				// dropping second time is not expected to raise any errors
93				err = client.DropIndex(wpolicy, ns, set, set+bin1.Name)
94				Expect(err).ToNot(HaveOccurred())
95
96				// create the index again; should not encounter any errors
97				idxTask, err = client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING)
98				Expect(err).ToNot(HaveOccurred())
99
100				// wait until index is created
101				Expect(<-idxTask.OnComplete()).ToNot(HaveOccurred())
102
103				err = client.DropIndex(wpolicy, ns, set, set+bin1.Name)
104				Expect(err).ToNot(HaveOccurred())
105			})
106
107		})
108
109	})
110})
111