diff lucene/src/luan/modules/lucene/Lucene.luan @ 536:3058870cbe83

add Luan.number_type and Lucene.query.range
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 01 Jun 2015 00:27:45 -0600
parents 8a217fe5b4f3
children 919b9410008e
line wrap: on
line diff
--- a/lucene/src/luan/modules/lucene/Lucene.luan	Sun May 31 00:00:17 2015 -0600
+++ b/lucene/src/luan/modules/lucene/Lucene.luan	Mon Jun 01 00:27:45 2015 -0600
@@ -3,11 +3,14 @@
 local pairs = Luan.pairs
 local ipairs = Luan.ipairs
 local type = Luan.type
+local number_type = Luan.number_type
 local error = Luan.error
 local Table = require "luan:Table"
 local LuceneIndex = require "java:luan.modules.lucene.LuceneIndex"
 local Term = require "java:org.apache.lucene.index.Term"
 local TermQuery = require "java:org.apache.lucene.search.TermQuery"
+local TermRangeQuery = require "java:org.apache.lucene.search.TermRangeQuery"
+local NumericRangeQuery = require "java:org.apache.lucene.search.NumericRangeQuery"
 local MatchAllDocsQuery = require "java:org.apache.lucene.search.MatchAllDocsQuery"
 local BooleanQuery = require "java:org.apache.lucene.search.BooleanQuery"
 local BooleanClause = require "java:org.apache.lucene.search.BooleanClause"
@@ -77,9 +80,42 @@
 		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))
+		local tp = type(value)
+		if tp == "string" then
+			return TermQuery.new(Term.new(field,value))
+		end
+		if tp == "number" then
+			return queryTbl.range(field,value,value)
+		end
+		error("invalid term value type: "..tp)
 	end
-	
+
+	function queryTbl.range(field,min,max,include_min,include_max)
+		if include_min == nil then include_min = true end
+		if include_max == nil then include_max = true end
+		field = index.map_field_name(field)
+		local tp = type(min)
+		tp == type(max) or error "min and max types don't match"
+		if tp == "string" then
+			return TermRangeQuery.newStringRange(field,min,max,include_min,include_max)
+		end
+		if tp == "number" then
+			tp = number_type(min)
+			tp == number_type(max) or error "min and max number types don't match"
+			if tp == "integer" then
+				return NumericRangeQuery.newIntRange(field,min,max,include_min,include_max)
+			end
+			if tp == "long" then
+				return NumericRangeQuery.newLongRange(field,min,max,include_min,include_max)
+			end
+			if tp == "double" then
+				return NumericRangeQuery.newDoubleRange(field,min,max,include_min,include_max)
+			end
+			error("invalid term value type: "..tp)
+		end
+		error("invalid term value type: "..tp)
+	end
+
 	function queryTbl.boolean(t)
 		local boolean_query = BooleanQuery.new()
 		for query, occur_string in pairs(t) do