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 }