Skip to content

Commit

Permalink
Fixes an issue where meta tags were ignored in reflection API for Sca…
Browse files Browse the repository at this point in the history
…nAllObjects/QueryObjects/BatchGetObjects. Resolves aerospike#260.
  • Loading branch information
khaf authored and gburanov committed Nov 15, 2019
1 parent a6070ac commit f488da9
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 12 deletions.
8 changes: 6 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
# Change History

## April 16 2019: v2.1.1
Minor Improvements release.
## April 25 2019: v2.1.1
Minor Fixes and improvements release.

* **Fixes**

- Fixes an issue where meta tags were ignored in reflection API for `ScanAllObjects`/`QueryObjects`/`BatchGetObjects`. Resolves #260.

* **Improvements**

Expand Down
4 changes: 4 additions & 0 deletions batch_command_reflect.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ func batchParseObject(
if err := setObjectField(cmd.resObjMappings, iobj, name, value, supportsFloat); err != nil {
return err
}

if err := setObjectMetaFields(obj, expiration, generation); err != nil {
return err
}
}

return nil
Expand Down
65 changes: 58 additions & 7 deletions client_object_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ var _ = Describe("Aerospike", func() {
}

type testObject struct {
TTL uint32 `asm:"ttl"`
Gen uint32 `asm:"gen"`

Nil interface{}
NilP *int

Expand Down Expand Up @@ -193,6 +196,9 @@ var _ = Describe("Aerospike", func() {
}

type testObjectTagged struct {
TTL uint32 `asm:"ttl"`
Gen uint32 `asm:"gen"`

Nil interface{} `as:"nil"`
NilP *int `as:"nilp"`

Expand Down Expand Up @@ -625,6 +631,11 @@ var _ = Describe("Aerospike", func() {

resObj := &testObject{}
err = client.GetObject(nil, key, resObj)

// set the Gen and TTL
testObj.TTL = resObj.TTL
testObj.Gen = resObj.Gen

Expect(err).ToNot(HaveOccurred())
Expect(resObj).To(Equal(testObj))
Expect(resObj.AnonymP).NotTo(BeNil())
Expand All @@ -643,6 +654,11 @@ var _ = Describe("Aerospike", func() {
Expect(len(found)).To(Equal(1))
Expect(found[0]).To(BeTrue())
Expect(err).ToNot(HaveOccurred())

// set the Gen and TTL
testObj.TTL = resObj.TTL
testObj.Gen = resObj.Gen

Expect(resObj).To(Equal(testObj))
Expect(resObj.AnonymP).NotTo(BeNil())
})
Expand All @@ -655,6 +671,11 @@ var _ = Describe("Aerospike", func() {

resObj := &testObjectTagged{}
err = client.GetObject(nil, key, resObj)

// set the Gen and TTL
testObj.TTL = resObj.TTL
testObj.Gen = resObj.Gen

Expect(err).ToNot(HaveOccurred())
Expect(resObj).To(Equal(testObj))
Expect(resObj.AnonymP).NotTo(BeNil())
Expand Down Expand Up @@ -825,6 +846,7 @@ var _ = Describe("Aerospike", func() {
resObjects = nil
objects = nil

wpolicy := as.NewWritePolicy(0, 500)
for i := 0; i < 100; i++ {
key, err = as.NewKey(ns, set, randString(50))
Expect(err).ToNot(HaveOccurred())
Expand All @@ -839,7 +861,7 @@ var _ = Describe("Aerospike", func() {

testObj := makeTestObjectTagged()
objects = append(objects, testObj)
err := client.PutObject(nil, key, testObj)
err := client.PutObject(wpolicy, key, testObj)
Expect(err).ToNot(HaveOccurred())
}

Expand Down Expand Up @@ -868,6 +890,13 @@ var _ = Describe("Aerospike", func() {
} else {
Expect(found[i]).To(BeTrue())
resObj := resObjects[i].(*testObjectTagged)

Expect(resObj.TTL).To(BeNumerically("<=", 500))
Expect(resObj.Gen).To(BeNumerically(">", 0))

objects[i].TTL = resObj.TTL
objects[i].Gen = resObj.Gen

Expect(resObj).To(Equal(objects[i]))
}
}
Expand Down Expand Up @@ -926,19 +955,22 @@ var _ = Describe("Aerospike", func() {
Context("ScanObjects operations", func() {

type InnerStruct struct {
PersistNot int `as:"-"`
PersistAsInner1 int `as:"inner1"`
PersistNot int `as:"-"`
PersistAsInner1 int `as:"inner1"`
Gen uint32 `asm:"gen"`
TTL uint32 `asm:"ttl"`
}

BeforeEach(func() {
set = randString(50)

wp := as.NewWritePolicy(0, 500)
for i := 1; i < 100; i++ {
key, err = as.NewKey(ns, set, randString(50))
Expect(err).ToNot(HaveOccurred())

testObj := InnerStruct{PersistAsInner1: i}
err := client.PutObject(nil, key, &testObj)
err := client.PutObject(wp, key, &testObj)
Expect(err).ToNot(HaveOccurred())
}

Expand All @@ -957,8 +989,12 @@ var _ = Describe("Aerospike", func() {
for resObj := range retChan {
Expect(resObj.PersistAsInner1).To(BeNumerically(">", 0))
Expect(resObj.PersistNot).To(Equal(0))
Expect(resObj.Gen).To(BeNumerically(">", 0))
Expect(resObj.TTL).To(BeNumerically("<=", 500))

testObj.PersistAsInner1 = resObj.PersistAsInner1
testObj.Gen = resObj.Gen
testObj.TTL = resObj.TTL
Expect(resObj).To(Equal(testObj))
cnt++
}
Expand All @@ -975,19 +1011,22 @@ var _ = Describe("Aerospike", func() {
Context("QueryObjects operations", func() {

type InnerStruct struct {
PersistNot int `as:"-"`
PersistAsInner1 int `as:"inner1"`
PersistNot int `as:"-"`
PersistAsInner1 int `as:"inner1"`
Gen uint32 `asm:"gen"`
TTL uint32 `asm:"ttl"`
}

BeforeEach(func() {
set = randString(50)

wp := as.NewWritePolicy(5, 500)
for i := 1; i < 100; i++ {
key, err = as.NewKey(ns, set, randString(50))
Expect(err).ToNot(HaveOccurred())

testObj := InnerStruct{PersistAsInner1: i}
err := client.PutObject(nil, key, &testObj)
err := client.PutObject(wp, key, &testObj)
Expect(err).ToNot(HaveOccurred())
}

Expand All @@ -1007,8 +1046,12 @@ var _ = Describe("Aerospike", func() {
for resObj := range retChan {
Expect(resObj.PersistAsInner1).To(BeNumerically(">", 0))
Expect(resObj.PersistNot).To(Equal(0))
Expect(resObj.Gen).To(BeNumerically(">", 0))
Expect(resObj.TTL).To(BeNumerically("<=", 500))

testObj.PersistAsInner1 = resObj.PersistAsInner1
testObj.Gen = resObj.Gen
testObj.TTL = resObj.TTL
Expect(resObj).To(Equal(testObj))
cnt++
}
Expand Down Expand Up @@ -1044,8 +1087,12 @@ var _ = Describe("Aerospike", func() {
Expect(resObj.PersistAsInner1).To(BeNumerically(">=", 21))
Expect(resObj.PersistAsInner1).To(BeNumerically("<=", 70))
Expect(resObj.PersistNot).To(Equal(0))
Expect(resObj.Gen).To(BeNumerically(">", 0))
Expect(resObj.TTL).To(BeNumerically("<=", 500))

testObj.PersistAsInner1 = resObj.PersistAsInner1
testObj.Gen = resObj.Gen
testObj.TTL = resObj.TTL
Expect(resObj).To(Equal(testObj))
cnt++
}
Expand Down Expand Up @@ -1084,8 +1131,12 @@ var _ = Describe("Aerospike", func() {
Expect(resObj.PersistAsInner1).To(BeNumerically(">=", 21))
Expect(resObj.PersistAsInner1).To(BeNumerically("<=", 70))
Expect(resObj.PersistNot).To(Equal(0))
Expect(resObj.Gen).To(BeNumerically(">", 0))
Expect(resObj.TTL).To(BeNumerically("<=", 500))

testObj.PersistAsInner1 = resObj.PersistAsInner1
testObj.Gen = resObj.Gen
testObj.TTL = resObj.TTL
Expect(resObj).To(Equal(testObj))
cnt++

Expand Down
8 changes: 5 additions & 3 deletions marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ import (
var aerospikeTag = "as"

const (
aerospikeMetaTag = "asm"
aerospikeMetaTag = "asm"
aerospikeMetaTagGen = "gen"
aerospikeMetaTagTTL = "ttl"
)

// SetAerospikeTag sets the bin tag to the specified tag.
Expand Down Expand Up @@ -284,9 +286,9 @@ func cacheObjectTags(objType reflect.Type) {
}
}

if tagM == "ttl" {
if tagM == aerospikeMetaTagTTL {
ttl = append(ttl, f.Name)
} else if tagM == "gen" {
} else if tagM == aerospikeMetaTagGen {
gen = append(gen, f.Name)
} else if tagM != "" {
panic(fmt.Sprintf("Invalid metadata tag `%s` on struct attribute: %s.%s", tagM, objType.Name(), f.Name))
Expand Down

0 comments on commit f488da9

Please sign in to comment.