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);
 		}