forked from philipsoutham/golucy
/
plan.go
127 lines (115 loc) · 3.55 KB
/
plan.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright 2013 Philip Southam
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package golucy
/*
#include "Clownfish/CharBuf.h"
#include "Lucy/Analysis/EasyAnalyzer.h"
#include "Lucy/Plan/FullTextType.h"
#include "Lucy/Plan/BlobType.h"
#include "Lucy/Plan/StringType.h"
#include "Lucy/Plan/Schema.h"
#define DECREF cfish_Obj_decref
#define CFishObj cfish_Obj
#define CFishCharBuf cfish_CharBuf
#define LucySchema lucy_Schema
#define LucySchemaNew lucy_Schema_new
#define LucyEasyAnalyzerNew lucy_EasyAnalyzer_new
#define LucyFullTextTypeNew lucy_FullTextType_new
#define LucyFullTextTypeInitOptions lucy_FullTextType_init2
#define LucyBlobTypeNew lucy_BlobType_new
#define LucyStringTypeNew lucy_StringType_new
#define LucyStringTypeInitOptions lucy_StringType_init2
#define LucySchemaSpecField LUCY_Schema_Spec_Field
*/
import "C"
type PlanItemOptions struct {
Stored bool
Indexed bool
Sortable bool
Highlightable bool
Boost float32
Language string // used only for FullTextType
}
type PlanItem struct {
Field string
Type IndexType
Options *PlanItemOptions
}
type Schema struct {
PlanItems []*PlanItem
lucySchema *C.LucySchema
}
func (schema *Schema) AddPlanItem(item *PlanItem) {
schema.PlanItems = append(schema.PlanItems, item)
}
func (schema *Schema) Commit() {
schema.createLucySchema()
}
func (schema *Schema) createLucySchema() {
lucySchema := C.LucySchemaNew()
for _, item := range schema.PlanItems {
var specType *C.CFishObj
if item.Type == FullTextType {
var language *C.CFishCharBuf
if item.Options != nil && item.Options.Language != "" {
language = cb_newf(item.Options.Language)
} else {
language = cb_newf("en")
}
analyzer := C.LucyEasyAnalyzerNew(language)
specType = C.LucyFullTextTypeNew(analyzer)
// TODO: come up with a better way to handle options.
// This isn't very friendly.
if item.Options != nil {
specType = C.LucyFullTextTypeInitOptions(specType, analyzer,
(C.float)(item.Options.Boost),
(C.bool)(item.Options.Indexed),
(C.bool)(item.Options.Stored),
(C.bool)(item.Options.Sortable),
(C.bool)(item.Options.Highlightable),
)
}
C.DECREF(language)
C.DECREF(analyzer)
} else if item.Type == StringType {
specType = C.LucyStringTypeNew()
if item.Options != nil {
specType = C.LucyStringTypeInitOptions(specType,
(C.float)(item.Options.Boost),
(C.bool)(item.Options.Indexed),
(C.bool)(item.Options.Stored),
(C.bool)(item.Options.Sortable),
)
}
} else if item.Type == BlobType {
isStored := (C.bool)(false)
if item.Options != nil && item.Options.Stored {
isStored = (C.bool)(true)
}
specType = C.LucyBlobTypeNew(isStored)
// need to send []cfish_byte castable value
panic("BlobType not supported yet")
} else {
panic("Type not supported yet")
}
fieldName := cb_newf(item.Field)
C.LucySchemaSpecField(lucySchema, fieldName, specType)
C.DECREF(fieldName)
C.DECREF(specType)
}
schema.lucySchema = lucySchema
}
func (schema *Schema) Close() {
C.DECREF(schema.lucySchema)
}