Skip to content

Commit e0864a7

Browse files
AvitalFineRedisrafiegkorlandchayim
authored
add AS to fields and new test to check FT.SERCH after JSON.SET (#115)
* Add a new test to check FT.SEARCH after JSON.SET * Add AS statements to fields for SCHEMA * CircleCI: replaced redismod:edge with rediseach:edge Co-authored-by: rafie <[email protected]> Co-authored-by: Guy Korland <[email protected]> Co-authored-by: Chayim <[email protected]>
1 parent 7ea2f1d commit e0864a7

File tree

4 files changed

+79
-7
lines changed

4 files changed

+79
-7
lines changed

.circleci/config.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ jobs:
4747
TLS_KEY=redis/tests/tls/redis.key \
4848
TLS_CACERT=redis/tests/tls/ca.crt
4949
50+
5051
build: # test with redisearch:latest
5152
docker:
5253
- image: circleci/golang:1.12
@@ -72,7 +73,7 @@ jobs:
7273
- checkout
7374
- run: make test
7475

75-
build_nightly: # test nightly with redisearch:edge
76+
build-edge: # test nightly with redisearch:edge
7677
docker:
7778
- image: circleci/golang:1.12
7879
- image: redislabs/redisearch:edge
@@ -88,6 +89,7 @@ workflows:
8889
jobs:
8990
- build-tls
9091
- build
92+
- build-edge
9193
- build-v16
9294
nightly:
9395
triggers:
@@ -98,5 +100,5 @@ workflows:
98100
only:
99101
- master
100102
jobs:
101-
- build_nightly
103+
- build-edge
102104
- build-tls

redisearch/client_test.go

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -914,15 +914,68 @@ func TestClient_CreateIndex(t *testing.T) {
914914

915915
// Create docs with a name that has the same phonetic matcher
916916
vanillaConnection := c.pool.Get()
917-
vanillaConnection.Do("HSET", "create-index-info:doc1", "name", "Jon", "age", 25)
918-
vanillaConnection.Do("HSET", "create-index-info:doc2", "name", "John", "age", 20)
917+
_, err = vanillaConnection.Do("HSET", "create-index-info:doc1", "name", "Jon", "age", 25)
918+
assert.Nil(t, err)
919+
_, err = vanillaConnection.Do("HSET", "create-index-info:doc2", "name", "John", "age", 20)
920+
assert.Nil(t, err)
919921

920922
// Wait for all documents to be indexed
921-
info, _ := c.Info()
923+
info, err := c.Info()
924+
assert.Nil(t, err)
925+
for info.IsIndexing {
926+
time.Sleep(time.Second)
927+
info, _ = c.Info()
928+
}
929+
930+
assert.Equal(t, uint64(2), info.DocCount)
931+
assert.Equal(t, false, info.IsIndexing)
932+
assert.Equal(t, uint64(0), info.HashIndexingFailures)
933+
934+
docs, total, err := c.Search(NewQuery("Jon").SetReturnFields("name"))
935+
assert.Nil(t, err)
936+
// Verify that the we've received 2 documents ( Jon and John )
937+
assert.Equal(t, 2, total)
938+
assert.Equal(t, "Jon", docs[0].Properties["name"])
939+
assert.Equal(t, "John", docs[1].Properties["name"])
940+
}
941+
942+
func TestClient_CreateJsonIndex(t *testing.T) {
943+
c := createClient("create-json-index")
944+
flush(c)
945+
version, _ := c.getRediSearchVersion()
946+
if version < 20200 {
947+
// IndexDefinition is available for RediSearch 2.0+
948+
return
949+
}
950+
951+
// Create a schema
952+
schema := NewSchema(DefaultOptions).
953+
AddField(NewTextFieldOptions("$.name", TextFieldOptions{Sortable: true, PhoneticMatcher: PhoneticDoubleMetaphoneEnglish, As: "name"})).
954+
AddField(NewNumericFieldOptions("$.age", NumericFieldOptions{As: "age"}))
955+
956+
// IndexDefinition is available for RediSearch 2.0+
957+
// In this example we will only index keys started by product:
958+
indexDefinition := NewIndexDefinition().SetIndexOn(JSON).AddPrefix("create-json-index:")
959+
960+
// Add the Index Definition
961+
err := c.CreateIndexWithIndexDefinition(schema, indexDefinition)
962+
assert.Nil(t, err)
963+
964+
// Create docs with a name that has the same phonetic matcher
965+
vanillaConnection := c.pool.Get()
966+
_, err = vanillaConnection.Do("JSON.SET", "create-json-index:doc1", "$", "{\"name\":\"Jon\", \"age\": 25}")
967+
assert.Nil(t, err)
968+
_, err = vanillaConnection.Do("JSON.SET", "create-json-index:doc2", "$", "{\"name\":\"John\", \"age\": 25}")
969+
assert.Nil(t, err)
970+
971+
// Wait for all documents to be indexed
972+
info, err := c.Info()
973+
assert.Nil(t, err)
922974
for info.IsIndexing {
923975
time.Sleep(time.Second)
924976
info, _ = c.Info()
925977
}
978+
926979
assert.Equal(t, uint64(2), info.DocCount)
927980
assert.Equal(t, false, info.IsIndexing)
928981
assert.Equal(t, uint64(0), info.HashIndexingFailures)

redisearch/schema.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ type TextFieldOptions struct {
139139
NoStem bool
140140
NoIndex bool
141141
PhoneticMatcher PhoneticMatcherType
142+
As string
142143
}
143144

144145
// TagFieldOptions options for indexing tag fields
@@ -147,17 +148,20 @@ type TagFieldOptions struct {
147148
Separator byte
148149
NoIndex bool
149150
Sortable bool
151+
As string
150152
}
151153

152154
// NumericFieldOptions Options for numeric fields
153155
type NumericFieldOptions struct {
154156
Sortable bool
155157
NoIndex bool
158+
As string
156159
}
157160

158161
// GeoFieldOptions Options for geo fields
159162
type GeoFieldOptions struct {
160163
NoIndex bool
164+
As string
161165
}
162166

163167
// NewTextField creates a new text field with the given weight
@@ -313,6 +317,9 @@ func serializeField(f Field, args redis.Args) (argsOut redis.Args, err error) {
313317
err = fmt.Errorf("Error on TextField serialization")
314318
return
315319
}
320+
if opts.As != "" {
321+
argsOut = append(argsOut[:len(argsOut)-1], "AS", opts.As, "TEXT")
322+
}
316323
if opts.Weight != 0 && opts.Weight != 1 {
317324
argsOut = append(argsOut, "WEIGHT", opts.Weight)
318325
}
@@ -337,6 +344,9 @@ func serializeField(f Field, args redis.Args) (argsOut redis.Args, err error) {
337344
err = fmt.Errorf("Error on NumericField serialization")
338345
return
339346
}
347+
if opts.As != "" {
348+
argsOut = append(argsOut[:len(argsOut)-1], "AS", opts.As, "NUMERIC")
349+
}
340350
if opts.Sortable {
341351
argsOut = append(argsOut, "SORTABLE")
342352
}
@@ -352,6 +362,9 @@ func serializeField(f Field, args redis.Args) (argsOut redis.Args, err error) {
352362
err = fmt.Errorf("Error on TagField serialization")
353363
return
354364
}
365+
if opts.As != "" {
366+
argsOut = append(argsOut[:len(argsOut)-1], "AS", opts.As, "TAG")
367+
}
355368
if opts.Separator != 0 {
356369
argsOut = append(argsOut, "SEPARATOR", fmt.Sprintf("%c", opts.Separator))
357370
}
@@ -370,6 +383,9 @@ func serializeField(f Field, args redis.Args) (argsOut redis.Args, err error) {
370383
err = fmt.Errorf("Error on GeoField serialization")
371384
return
372385
}
386+
if opts.As != "" {
387+
argsOut = append(argsOut[:len(argsOut)-1], "AS", opts.As, "GEO")
388+
}
373389
if opts.NoIndex {
374390
argsOut = append(argsOut, "NOINDEX")
375391
}

redisearch/schema_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,12 @@ func TestSerializeSchema(t *testing.T) {
5959
{"default-and-numeric-with-options-noindex", args{NewSchema(DefaultOptions).AddField(NewNumericFieldOptions("numeric-field", NumericFieldOptions{NoIndex: true, Sortable: false})), redis.Args{}}, redis.Args{"SCHEMA", "numeric-field", "NUMERIC", "NOINDEX"}, false},
6060
{"default-and-text", args{NewSchema(DefaultOptions).AddField(NewTextField("text-field")), redis.Args{}}, redis.Args{"SCHEMA", "text-field", "TEXT"}, false},
6161
{"default-and-sortable-text-field", args{NewSchema(DefaultOptions).AddField(NewSortableTextField("text-field", 10)), redis.Args{}}, redis.Args{"SCHEMA", "text-field", "TEXT", "WEIGHT", float32(10.0), "SORTABLE"}, false},
62-
{"default-and-text-with-options", args{NewSchema(DefaultOptions).AddField(NewTextFieldOptions("text-field", TextFieldOptions{Weight: 5.0, Sortable: true, NoStem: false, NoIndex: false})), redis.Args{}}, redis.Args{"SCHEMA", "text-field", "TEXT", "WEIGHT", float32(5.0), "SORTABLE"}, false},
62+
{"default-and-text-with-options", args{NewSchema(DefaultOptions).AddField(NewTextFieldOptions("text-field", TextFieldOptions{Weight: 5.0, Sortable: true, NoStem: false, NoIndex: false, As: "field"})), redis.Args{}}, redis.Args{"SCHEMA", "text-field", "AS", "field", "TEXT", "WEIGHT", float32(5.0), "SORTABLE"}, false},
6363
{"default-and-text-with-phonetic-en", args{NewSchema(DefaultOptions).AddField(NewTextFieldOptions("text-field", TextFieldOptions{PhoneticMatcher: PhoneticDoubleMetaphoneEnglish})), redis.Args{}}, redis.Args{"SCHEMA", "text-field", "TEXT", "PHONETIC", "dm:en"}, false},
6464
{"default-and-text-with-phonetic-pt", args{NewSchema(DefaultOptions).AddField(NewTextFieldOptions("text-field", TextFieldOptions{PhoneticMatcher: PhoneticDoubleMetaphonePortuguese})), redis.Args{}}, redis.Args{"SCHEMA", "text-field", "TEXT", "PHONETIC", "dm:pt"}, false},
6565
{"default-and-tag", args{NewSchema(DefaultOptions).AddField(NewTagField("tag-field")), redis.Args{}}, redis.Args{"SCHEMA", "tag-field", "TAG", "SEPARATOR", ","}, false},
66-
{"default-and-tag-with-options", args{NewSchema(DefaultOptions).AddField(NewTagFieldOptions("tag-field", TagFieldOptions{Sortable: true, NoIndex: false, Separator: byte(',')})), redis.Args{}}, redis.Args{"SCHEMA", "tag-field", "TAG", "SEPARATOR", ",", "SORTABLE"}, false},
66+
{"default-and-tag-with-options", args{NewSchema(DefaultOptions).AddField(NewTagFieldOptions("tag-field", TagFieldOptions{Sortable: true, NoIndex: false, Separator: byte(','), As: "field"})), redis.Args{}}, redis.Args{"SCHEMA", "tag-field", "AS", "field", "TAG", "SEPARATOR", ",", "SORTABLE"}, false},
67+
{"default-geo-with-options", args{NewSchema(DefaultOptions).AddField(NewGeoFieldOptions("location", GeoFieldOptions{As: "loc"})), redis.Args{}}, redis.Args{"SCHEMA", "location", "AS", "loc", "GEO"}, false},
6768
{"error-unsupported", args{NewSchema(DefaultOptions).AddField(Field{Type: 10}), redis.Args{}}, nil, true},
6869
}
6970
for _, tt := range tests {

0 commit comments

Comments
 (0)