search: fix bug stopping facets working in structs
This was working in the legacy "appengine/search" package, but not in
this version. Added a test to verify the conversion works as
expected.
Change-Id: Icee85b9743277945ede53f186114ed7dee33eaea
diff --git a/search/search.go b/search/search.go
index cbba874..477c38c 100644
--- a/search/search.go
+++ b/search/search.go
@@ -840,7 +840,7 @@
case FieldLoadSaver:
fields, meta, err = x.Save()
default:
- fields, err = SaveStruct(src)
+ fields, meta, err = saveStructWithMeta(src)
}
if err != nil {
return nil, err
diff --git a/search/search_test.go b/search/search_test.go
index fd00654..75bac4b 100644
--- a/search/search_test.go
+++ b/search/search_test.go
@@ -115,6 +115,16 @@
}
}
+func newFacet(name, value string, valueType pb.FacetValue_ContentType) *pb.Facet {
+ return &pb.Facet{
+ Name: proto.String(name),
+ Value: &pb.FacetValue{
+ StringValue: proto.String(value),
+ Type: valueType.Enum(),
+ },
+ }
+}
+
func TestValidIndexNameOrDocID(t *testing.T) {
testCases := []struct {
s string
@@ -249,6 +259,44 @@
}
}
+func TestLoadSaveWithStruct(t *testing.T) {
+ type gopher struct {
+ Name string
+ Info string `search:"about"`
+ Legs float64 `search:",facet"`
+ Fuzz Atom `search:"Fur,facet"`
+ }
+
+ doc := gopher{"Gopher", "Likes slide rules.", 4, Atom("furry")}
+ pb := &pb.Document{
+ Field: []*pb.Field{
+ newStringValueField("Name", "Gopher", pb.FieldValue_TEXT),
+ newStringValueField("about", "Likes slide rules.", pb.FieldValue_TEXT),
+ },
+ Facet: []*pb.Facet{
+ newFacet("Legs", "4e+00", pb.FacetValue_NUMBER),
+ newFacet("Fur", "furry", pb.FacetValue_ATOM),
+ },
+ }
+
+ var gotDoc gopher
+ if err := loadDoc(&gotDoc, pb, nil); err != nil {
+ t.Fatalf("loadDoc: %v", err)
+ }
+ if !reflect.DeepEqual(gotDoc, doc) {
+ t.Errorf("loading doc\ngot %v\nwant %v", gotDoc, doc)
+ }
+
+ gotPB, err := saveDoc(&doc)
+ if err != nil {
+ t.Fatalf("saveDoc: %v", err)
+ }
+ gotPB.OrderId = nil // Don't test: it's time dependent.
+ if !proto.Equal(gotPB, pb) {
+ t.Errorf("saving doc\ngot %v\nwant %v", gotPB, pb)
+ }
+}
+
func TestValidFieldNames(t *testing.T) {
testCases := []struct {
name string