Mercurial Hosting > luan
diff 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 |
line wrap: on
line diff
--- a/lucene/src/luan/modules/lucene/LuceneSearcher.java Wed Dec 03 02:26:19 2014 +0000 +++ b/lucene/src/luan/modules/lucene/LuceneSearcher.java Thu Dec 04 09:27:20 2014 +0000 @@ -58,113 +58,6 @@ // luan - private Query termQuery(LuanTable queryTbl) { - if( queryTbl.length() != 0 ) - return null; - Map<Object,Object> map = queryTbl.asMap(); - if( map.size() != 1 ) - return null; - Map.Entry<Object,Object> entry = map.entrySet().iterator().next(); - Object key = entry.getKey(); - Object value = entry.getValue(); - if( key instanceof String && value instanceof String ) { - return new TermQuery(index.newTerm( (String)key, (String)value )); - } - return null; - } - - private Query booleanQuery(LuanTable queryTbl) { - if( !queryTbl.isList() ) - return null; - List<Object> clauses = queryTbl.asList(); - BooleanQuery query = new BooleanQuery(); - for( Object obj : clauses ) { - if( !(obj instanceof LuanTable) ) - return null; - LuanTable tbl = (LuanTable)obj; - if( !(tbl.isList() && tbl.length()==2) ) - return null; - List<Object> list = tbl.asList(); - Object obj0 = list.get(0); - Object obj1 = list.get(1); - if( !(obj0 instanceof String && obj1 instanceof LuanTable) ) - return null; - BooleanClause.Occur occur; - try { - occur = BooleanClause.Occur.valueOf( ((String)obj0).toUpperCase() ); - } catch(IllegalArgumentException e) { - return null; - } - Query subQuery = query( (LuanTable)obj1 ); - if( subQuery == null ) - return null; - query.add(subQuery,occur); - } - return query; - } - - private Query query(LuanTable queryTbl) { - if( queryTbl.isEmpty() ) - return null; - Query query; - query = termQuery(queryTbl); if(query!=null) return query; - query = booleanQuery(queryTbl); if(query!=null) return query; - return null; - } - - private SortField sortField(LuanState luan,List<Object> list,String pos) throws LuanException { - int size = list.size(); - if( size < 2 || size > 3 ) - throw luan.exception("invalid sort field"+pos); - Object obj0 = list.get(0); - Object obj1 = list.get(1); - if( !(obj0 instanceof String && obj1 instanceof String) ) - throw luan.exception("invalid sort field"+pos); - String field = (String)obj0; - field = index.fixFieldName(field); - SortField.Type type; - try { - type = SortField.Type.valueOf( ((String)obj1).toUpperCase() ); - } catch(IllegalArgumentException e) { - throw luan.exception("invalid sort field type"+pos); - } - if( size == 2 ) - return new SortField(field,type); - Object obj2 = list.get(2); - if( !(obj2 instanceof String) ) - throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); - String order = (String)obj2; - boolean reverse; - if( order.equalsIgnoreCase("ascending") ) - reverse = false; - else if( order.equalsIgnoreCase("descending") ) - reverse = true; - else - throw luan.exception("invalid sort field"+pos+", order must be 'ascending' or 'descending'"); - return new SortField( field, type, reverse ); - } - - private Sort sort(LuanState luan,LuanTable sortTbl) throws LuanException { - if( !sortTbl.isList() ) - throw luan.exception("invalid sort, must be list"); - List<Object> list = sortTbl.asList(); - if( list.isEmpty() ) - throw luan.exception("sort cannot be empty"); - if( list.get(0) instanceof String ) - return new Sort(sortField(luan,list,"")); - SortField[] flds = new SortField[list.size()]; - for( int i=0; i<flds.length; i++ ) { - Object obj = list.get(i); - if( !(obj instanceof LuanTable) ) - throw luan.exception("invalid sort parameter at position "+(i+1)); - LuanTable fldTbl = (LuanTable)obj; - if( !fldTbl.isList() ) - throw luan.exception("invalid sort field at position "+(i+1)+", must be list"); - flds[i] = sortField(luan,fldTbl.asList()," at position "+(i+1)); - } - return new Sort(flds); - } - private static final LuanFunction nothingFn = new LuanFunction() { @Override public Object call(LuanState luan,Object[] args) { return LuanFunction.NOTHING; @@ -179,15 +72,7 @@ } } - public Object[] search( final LuanState luan, LuanTable queryTbl, Object nObj, LuanTable sortTbl ) throws LuanException, IOException { - Query query; - if( queryTbl == null ) { - query = new MatchAllDocsQuery(); - } else { - query = query(queryTbl); - if( query == null ) - throw luan.exception("invalid query"); - } + public Object[] search( final LuanState luan, Query query, Object nObj, Sort sort ) throws LuanException, IOException { if( nObj instanceof LuanFunction ) { final LuanFunction fn = (LuanFunction)nObj; Collector col = new MyCollector() { @@ -218,7 +103,7 @@ searcher.search(query,thcc); return new Object[]{ nothingFn, 0, thcc.getTotalHits() }; } - TopDocs td = sortTbl==null ? searcher.search(query,n) : searcher.search(query,n,sort(luan,sortTbl)); + TopDocs td = sort==null ? searcher.search(query,n) : searcher.search(query,n,sort); final ScoreDoc[] scoreDocs = td.scoreDocs; LuanFunction results = new LuanFunction() { int i = 0; @@ -244,7 +129,7 @@ LuanTable table() { LuanTable tbl = Luan.newTable(); try { - add( tbl, "search", LuanState.class, LuanTable.class, Object.class, LuanTable.class ); + add( tbl, "search", LuanState.class, Query.class, Object.class, Sort.class ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); }