-
Notifications
You must be signed in to change notification settings - Fork 0
/
PyFieldScheme.py
93 lines (76 loc) · 2.55 KB
/
PyFieldScheme.py
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
import xapian
class PyFieldScheme(object):
def __init__(self):
self._fields = {}
self._typeMap = {}
self._vnoMap = {}
def getFieldID(self):
name = self._typeMap[PyFieldMeta.TYPE_ID]
return self._fields[name]
def getFieldTitle(self):
name = self._typeMap[PyFieldMeta.TYPE_TITLE]
return self._fields[name]
def getAllFields(self):
return self._fields
def getOneFields(self,name):
return self._fields[name]
def getVnoMap(self):
return self._vnoMap
def getTypeMap(self):
return self._typeMap
def addField(self, field, config = None):
field = PyFieldMeta(field, config)
if field.isSpeical():
self._typeMap[field.ftype] = field.name
field.vno = len(self._vnoMap)
self._vnoMap[field.vno] = field.name
self._fields[field.name] = field
class PyFieldMeta(object):
TYPE_DATE = 'date'
TYPE_STRING = 'string'
TYPE_LONG = 'long'
TYPE_FLOAT = 'float'
TYPE_ID = 'id'
TYPE_TITLE = 'title'
def __init__(self, name, config):
self.name = unicode(name, 'utf-8')
self.ftype = u''
self.vno = 0
self.index = u''
self.weight = 0
self.fromConfig(config)
def fromConfig(self, config):
for (key, value) in config.items():
if u'type' == key:
self.ftype = value.lower()
if u'index' == key:
self.index = value.lower()
if u'weight' == key:
self.weight= value
def hasIndex(self):
return (self.index != u'')
def isSpeical(self):
return self.ftype == PyFieldMeta.TYPE_ID or self.ftype == PyFieldMeta.TYPE_TITLE
def convert(self, data):
if data is None:
return data
elif self.ftype == PyFieldMeta.TYPE_LONG:
data = data or long(0)
return u'%012d' % long(data)
elif self.ftype == PyFieldMeta.TYPE_FLOAT:
data = data or float(0)
return xapian.sortable_serialise(float(data))
elif self.ftype == PyFieldMeta.TYPE_DATE:
return unicode(data.strftime("%m %d"))
else:
return unicode(data)
def deconvert(self, data):
if data is None:
return data
if self.ftype == PyFieldMeta.TYPE_LONG:
data = data or long(0)
return long(data)
elif self.ftype == PyFieldMeta.TYPE_FLOAT:
return xapian.sortable_unserialise(data)
else:
return data.decode('utf-8')