Custom Go bindings for SortRule, SortSpec.

Custom constructors.  Have SortSpec handle `rules` as a slice of
SortRules rather than a Vector.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/295662d3
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/295662d3
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/295662d3

Branch: refs/heads/master
Commit: 295662d3570b0aa47ddebe69c12322e72d7cd107
Parents: d0388c8
Author: Marvin Humphrey <[email protected]>
Authored: Thu Sep 10 20:29:09 2015 -0700
Committer: Marvin Humphrey <[email protected]>
Committed: Tue Sep 15 15:54:50 2015 -0700

----------------------------------------------------------------------
 go/build.go            |  5 +++++
 go/lucy/search.go      | 39 +++++++++++++++++++++++++++++++++++++++
 go/lucy/search_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/295662d3/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index f18252e..11615aa 100644
--- a/go/build.go
+++ b/go/build.go
@@ -197,6 +197,11 @@ func specClasses(parcel *cfc.Parcel) {
        topDocsBinding.SpecMethod("Set_Match_Docs", "SetMatchDocs([]MatchDoc)")
        topDocsBinding.SpecMethod("Get_Match_Docs", "GetMatchDocs() []MatchDoc")
        topDocsBinding.Register()
+
+       sortSpecBinding := cfc.NewGoClass(parcel, "Lucy::Search::SortSpec")
+       sortSpecBinding.SetSuppressCtor(true)
+       sortSpecBinding.SpecMethod("Get_Rules", "GetRules() []SortRule")
+       sortSpecBinding.Register()
 }
 
 func build() {

http://git-wip-us.apache.org/repos/asf/lucy/blob/295662d3/go/lucy/search.go
----------------------------------------------------------------------
diff --git a/go/lucy/search.go b/go/lucy/search.go
index 4865072..2723265 100644
--- a/go/lucy/search.go
+++ b/go/lucy/search.go
@@ -27,6 +27,8 @@ package lucy
 #include "Lucy/Search/ANDMatcher.h"
 #include "Lucy/Search/ORMatcher.h"
 #include "Lucy/Search/SeriesMatcher.h"
+#include "Lucy/Search/SortRule.h"
+#include "Lucy/Search/SortSpec.h"
 #include "Lucy/Search/TopDocs.h"
 #include "Lucy/Document/HitDoc.h"
 #include "LucyX/Search/MockMatcher.h"
@@ -177,6 +179,43 @@ func (obj *HitsIMP) Error() error {
        return obj.err
 }
 
+func NewFieldSortRule(field string, reverse bool) SortRule {
+       fieldC := clownfish.GoToClownfish(field, 
unsafe.Pointer(C.CFISH_STRING), false)
+       cfObj := C.lucy_SortRule_new(C.lucy_SortRule_FIELD, 
(*C.cfish_String)(fieldC), C.bool(reverse))
+       return WRAPSortRule(unsafe.Pointer(cfObj))
+}
+
+func NewDocIDSortRule(reverse bool) SortRule {
+       cfObj := C.lucy_SortRule_new(C.lucy_SortRule_DOC_ID, nil, 
C.bool(reverse))
+       return WRAPSortRule(unsafe.Pointer(cfObj))
+}
+
+func NewScoreSortRule(reverse bool) SortRule {
+       cfObj := C.lucy_SortRule_new(C.lucy_SortRule_SCORE, nil, 
C.bool(reverse))
+       return WRAPSortRule(unsafe.Pointer(cfObj))
+}
+
+func NewSortSpec(rules []SortRule) SortSpec {
+       vec := clownfish.NewVector(len(rules))
+       for _, rule := range rules {
+               vec.Push(rule)
+       }
+       cfObj := C.lucy_SortSpec_new((*C.cfish_Vector)(clownfish.Unwrap(vec, 
"rules")))
+       return WRAPSortSpec(unsafe.Pointer(cfObj))
+}
+
+func (spec *SortSpecIMP) GetRules() []SortRule {
+       self := (*C.lucy_SortSpec)(clownfish.Unwrap(spec, "spec"))
+       vec := C.LUCY_SortSpec_Get_Rules(self)
+       length := int(C.CFISH_Vec_Get_Size(vec))
+       slice := make([]SortRule, length)
+       for i := 0; i < length; i++ {
+               elem := C.cfish_incref(unsafe.Pointer(C.CFISH_Vec_Fetch(vec, 
C.size_t(i))))
+               slice[i] = WRAPSortRule(unsafe.Pointer(elem))
+       }
+       return slice
+}
+
 func NewTopDocs(matchDocs []MatchDoc, totalHits uint32) TopDocs {
        vec := clownfish.NewVector(len(matchDocs))
        for _, matchDoc := range matchDocs {

http://git-wip-us.apache.org/repos/asf/lucy/blob/295662d3/go/lucy/search_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/search_test.go b/go/lucy/search_test.go
index 4225799..6e40670 100644
--- a/go/lucy/search_test.go
+++ b/go/lucy/search_test.go
@@ -354,3 +354,45 @@ func TestTopDocsBasics(t *testing.T) {
                t.Errorf("Failed round-trip serializetion of TopDocs")
        }
 }
+
+type simpleTestDoc struct {
+       Content string
+}
+
+func TestSortSpecBasics(t *testing.T) {
+       folder := NewRAMFolder("")
+       schema := NewSchema()
+       fieldType := NewFullTextType(NewStandardTokenizer())
+       fieldType.SetSortable(true)
+       schema.SpecField("content", fieldType)
+       args := &OpenIndexerArgs{Index: folder, Schema: schema, Create: true}
+       indexer, err := OpenIndexer(args)
+       if err != nil {
+               panic(err)
+       }
+       for _, fieldVal := range []string{"a b", "a a"} {
+               indexer.AddDoc(&simpleTestDoc{fieldVal})
+       }
+       indexer.Commit()
+
+       rules := []SortRule{
+               NewFieldSortRule("content", false),
+       }
+       sortSpec := NewSortSpec(rules)
+       searcher, _ := OpenIndexSearcher(folder)
+       hits, _ := searcher.Hits("a", 0, 1, sortSpec)
+       var doc simpleTestDoc
+       hits.Next(&doc)
+       if doc.Content != "a a" {
+               t.Error("Sort by field value")
+       }
+
+       outstream := folder.OpenOut("foo")
+       sortSpec.Serialize(outstream)
+       outstream.Close()
+       inStream := folder.OpenIn("foo")
+       dupe := 
clownfish.GetClass(sortSpec).MakeObj().(SortSpec).Deserialize(inStream)
+       if len(dupe.GetRules()) != len(rules) {
+               t.Errorf("Failed round-trip serializetion of SortSpec")
+       }
+}

Reply via email to