You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2015/09/28 21:52:18 UTC

[02/14] lucy git commit: Custom Go bindings for SortRule, SortSpec.

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 <ma...@rectangular.com>
Authored: Thu Sep 10 20:29:09 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
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")
+	}
+}