Mercurial Hosting > luan
comparison lucene/src/luan/modules/lucene/LuceneSearcher.java @ 287:4d53e9fc1bd9
change lucene search to take lucene objects
git-svn-id: https://luan-java.googlecode.com/svn/trunk@288 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Thu, 04 Dec 2014 09:27:20 +0000 |
parents | 582e8db4cdb6 |
children | a35d1177bbf0 |
comparison
equal
deleted
inserted
replaced
286:91be4027b2a8 | 287:4d53e9fc1bd9 |
---|---|
56 return searcher.search(query,n,sort); | 56 return searcher.search(query,n,sort); |
57 } | 57 } |
58 | 58 |
59 // luan | 59 // luan |
60 | 60 |
61 private Query termQuery(LuanTable queryTbl) { | |
62 if( queryTbl.length() != 0 ) | |
63 return null; | |
64 Map<Object,Object> map = queryTbl.asMap(); | |
65 if( map.size() != 1 ) | |
66 return null; | |
67 Map.Entry<Object,Object> entry = map.entrySet().iterator().next(); | |
68 Object key = entry.getKey(); | |
69 Object value = entry.getValue(); | |
70 if( key instanceof String && value instanceof String ) { | |
71 return new TermQuery(index.newTerm( (String)key, (String)value )); | |
72 } | |
73 return null; | |
74 } | |
75 | |
76 private Query booleanQuery(LuanTable queryTbl) { | |
77 if( !queryTbl.isList() ) | |
78 return null; | |
79 List<Object> clauses = queryTbl.asList(); | |
80 BooleanQuery query = new BooleanQuery(); | |
81 for( Object obj : clauses ) { | |
82 if( !(obj instanceof LuanTable) ) | |
83 return null; | |
84 LuanTable tbl = (LuanTable)obj; | |
85 if( !(tbl.isList() && tbl.length()==2) ) | |
86 return null; | |
87 List<Object> list = tbl.asList(); | |
88 Object obj0 = list.get(0); | |
89 Object obj1 = list.get(1); | |
90 if( !(obj0 instanceof String && obj1 instanceof LuanTable) ) | |
91 return null; | |
92 BooleanClause.Occur occur; | |
93 try { | |
94 occur = BooleanClause.Occur.valueOf( ((String)obj0).toUpperCase() ); | |
95 } catch(IllegalArgumentException e) { | |
96 return null; | |
97 } | |
98 Query subQuery = query( (LuanTable)obj1 ); | |
99 if( subQuery == null ) | |
100 return null; | |
101 query.add(subQuery,occur); | |
102 } | |
103 return query; | |
104 } | |
105 | |
106 private Query query(LuanTable queryTbl) { | |
107 if( queryTbl.isEmpty() ) | |
108 return null; | |
109 Query query; | |
110 query = termQuery(queryTbl); if(query!=null) return query; | |
111 query = booleanQuery(queryTbl); if(query!=null) return query; | |
112 return null; | |
113 } | |
114 | |
115 private SortField sortField(LuanState luan,List<Object> list,String pos) throws LuanException { | |
116 int size = list.size(); | |
117 if( size < 2 || size > 3 ) | |
118 throw luan.exception("invalid sort field"+pos); | |
119 Object obj0 = list.get(0); | |
120 Object obj1 = list.get(1); | |
121 if( !(obj0 instanceof String && obj1 instanceof String) ) | |
122 throw luan.exception("invalid sort field"+pos); | |
123 String field = (String)obj0; | |
124 field = index.fixFieldName(field); | |
125 SortField.Type type; | |
126 try { | |
127 type = SortField.Type.valueOf( ((String)obj1).toUpperCase() ); | |
128 } catch(IllegalArgumentException e) { | |
129 throw luan.exception("invalid sort field type"+pos); | |
130 } | |
131 if( size == 2 ) | |
132 return new SortField(field,type); | |
133 Object obj2 = list.get(2); | |
134 if( !(obj2 instanceof String) ) | |
135 throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); | |
136 String order = (String)obj2; | |
137 boolean reverse; | |
138 if( order.equalsIgnoreCase("ascending") ) | |
139 reverse = false; | |
140 else if( order.equalsIgnoreCase("descending") ) | |
141 reverse = true; | |
142 else | |
143 throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); | |
144 return new SortField( field, type, reverse ); | |
145 } | |
146 | |
147 private Sort sort(LuanState luan,LuanTable sortTbl) throws LuanException { | |
148 if( !sortTbl.isList() ) | |
149 throw luan.exception("invalid sort, must be list"); | |
150 List<Object> list = sortTbl.asList(); | |
151 if( list.isEmpty() ) | |
152 throw luan.exception("sort cannot be empty"); | |
153 if( list.get(0) instanceof String ) | |
154 return new Sort(sortField(luan,list,"")); | |
155 SortField[] flds = new SortField[list.size()]; | |
156 for( int i=0; i<flds.length; i++ ) { | |
157 Object obj = list.get(i); | |
158 if( !(obj instanceof LuanTable) ) | |
159 throw luan.exception("invalid sort parameter at position "+(i+1)); | |
160 LuanTable fldTbl = (LuanTable)obj; | |
161 if( !fldTbl.isList() ) | |
162 throw luan.exception("invalid sort field at position "+(i+1)+", must be list"); | |
163 flds[i] = sortField(luan,fldTbl.asList()," at position "+(i+1)); | |
164 } | |
165 return new Sort(flds); | |
166 } | |
167 | |
168 private static final LuanFunction nothingFn = new LuanFunction() { | 61 private static final LuanFunction nothingFn = new LuanFunction() { |
169 @Override public Object call(LuanState luan,Object[] args) { | 62 @Override public Object call(LuanState luan,Object[] args) { |
170 return LuanFunction.NOTHING; | 63 return LuanFunction.NOTHING; |
171 } | 64 } |
172 }; | 65 }; |
177 @Override public boolean acceptsDocsOutOfOrder() { | 70 @Override public boolean acceptsDocsOutOfOrder() { |
178 return true; | 71 return true; |
179 } | 72 } |
180 } | 73 } |
181 | 74 |
182 public Object[] search( final LuanState luan, LuanTable queryTbl, Object nObj, LuanTable sortTbl ) throws LuanException, IOException { | 75 public Object[] search( final LuanState luan, Query query, Object nObj, Sort sort ) throws LuanException, IOException { |
183 Query query; | |
184 if( queryTbl == null ) { | |
185 query = new MatchAllDocsQuery(); | |
186 } else { | |
187 query = query(queryTbl); | |
188 if( query == null ) | |
189 throw luan.exception("invalid query"); | |
190 } | |
191 if( nObj instanceof LuanFunction ) { | 76 if( nObj instanceof LuanFunction ) { |
192 final LuanFunction fn = (LuanFunction)nObj; | 77 final LuanFunction fn = (LuanFunction)nObj; |
193 Collector col = new MyCollector() { | 78 Collector col = new MyCollector() { |
194 @Override public void collect(int doc) { | 79 @Override public void collect(int doc) { |
195 try { | 80 try { |
216 if( n==0 ) { | 101 if( n==0 ) { |
217 TotalHitCountCollector thcc = new TotalHitCountCollector(); | 102 TotalHitCountCollector thcc = new TotalHitCountCollector(); |
218 searcher.search(query,thcc); | 103 searcher.search(query,thcc); |
219 return new Object[]{ nothingFn, 0, thcc.getTotalHits() }; | 104 return new Object[]{ nothingFn, 0, thcc.getTotalHits() }; |
220 } | 105 } |
221 TopDocs td = sortTbl==null ? searcher.search(query,n) : searcher.search(query,n,sort(luan,sortTbl)); | 106 TopDocs td = sort==null ? searcher.search(query,n) : searcher.search(query,n,sort); |
222 final ScoreDoc[] scoreDocs = td.scoreDocs; | 107 final ScoreDoc[] scoreDocs = td.scoreDocs; |
223 LuanFunction results = new LuanFunction() { | 108 LuanFunction results = new LuanFunction() { |
224 int i = 0; | 109 int i = 0; |
225 | 110 |
226 @Override public Object call(LuanState luan,Object[] args) throws LuanException { | 111 @Override public Object call(LuanState luan,Object[] args) throws LuanException { |
242 } | 127 } |
243 | 128 |
244 LuanTable table() { | 129 LuanTable table() { |
245 LuanTable tbl = Luan.newTable(); | 130 LuanTable tbl = Luan.newTable(); |
246 try { | 131 try { |
247 add( tbl, "search", LuanState.class, LuanTable.class, Object.class, LuanTable.class ); | 132 add( tbl, "search", LuanState.class, Query.class, Object.class, Sort.class ); |
248 } catch(NoSuchMethodException e) { | 133 } catch(NoSuchMethodException e) { |
249 throw new RuntimeException(e); | 134 throw new RuntimeException(e); |
250 } | 135 } |
251 return tbl; | 136 return tbl; |
252 } | 137 } |