diff lucene/src/luan/modules/lucene/Lucene.luan @ 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 eb27e765affb
children 899253043270
line wrap: on
line diff
--- a/lucene/src/luan/modules/lucene/Lucene.luan	Wed Dec 03 02:26:19 2014 +0000
+++ b/lucene/src/luan/modules/lucene/Lucene.luan	Thu Dec 04 09:27:20 2014 +0000
@@ -1,5 +1,13 @@
+import "luan:Table"
 import "luan:Java"
 import "java:luan.modules.lucene.LuceneIndex"
+import "java:org.apache.lucene.index.Term"
+import "java:org.apache.lucene.search.TermQuery"
+import "java:org.apache.lucene.search.MatchAllDocsQuery"
+import "java:org.apache.lucene.search.BooleanQuery"
+import "java:org.apache.lucene.search.BooleanClause"
+import "java:org.apache.lucene.search.Sort"
+import "java:org.apache.lucene.search.SortField"
 
 
 function Index(indexDir)
@@ -39,5 +47,69 @@
 		end )
 	end
 
+
+
+	local Query = {}
+	index.Query = Query
+
+	Query.all_docs = MatchAllDocsQuery.new()
+	
+	function Query.term(t)
+		local iter = pairs(t)
+		local field, value = iter()
+		field and value or error "missing term"
+		iter()==nil or error "only one term allowed"
+		field = index.map_field_name(field)
+		return TermQuery.new(Term.new(field,value))
+	end
+	
+	function Query.boolean(t)
+		local boolean_query = BooleanQuery.new()
+		for query, occur_string in pairs(t) do
+			local occur = BooleanClause.Occur.valueOf( occur_string.upper() )
+			boolean_query.add( query, occur )
+		end
+		return boolean_query
+	end
+	
+	-- and list
+	function Query.all(t)
+		local bt = {}
+		for key, query in pairs(t) do
+			if type(key)=="string" then
+				query = Query.term{[key]=query}
+			end
+			bt[query] = "MUST"
+		end
+		return Query.boolean(bt)
+	end
+	
+	-- or list
+	function Query.any(t)
+		local bt = {}
+		for key, query in pairs(t) do
+			if type(key)=="string" then
+				query = Query.term{[key]=query}
+			end
+			bt[query] = "SHOULD"
+		end
+		return Query.boolean(bt)
+	end
+	
+	
+	function Query.sort(fields)
+		#fields > 0 or error "list of sort fields expected"
+		local a = {}
+		for _, f in ipairs(fields) do
+			f.field or error "missing sort field"
+			f.type or error "missing sort type"
+			local type = SortField.Type.valueOf( f.type.upper() )
+			local reverse = f.reverse or false
+			a[#a+1] = SortField.new(f.field,type,reverse)
+		end
+		return Sort.new(Table.unpack(a))
+	end
+
+
 	return index
 end