diff src/luan/modules/lucene/Lucene.luan @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents lucene/src/luan/modules/lucene/Lucene.luan@50f279d3f889
children 6b8ea0a9b7c9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/lucene/Lucene.luan	Fri Aug 26 14:36:40 2016 -0600
@@ -0,0 +1,161 @@
+java()
+local Luan = require "luan:Luan.luan"
+local error = Luan.error
+local ipairs = Luan.ipairs or error()
+local type = Luan.type or error()
+local Html = require "luan:Html.luan"
+local Io = require "luan:Io.luan"
+local uri = Io.uri or error()
+local String = require "luan:String.luan"
+local matches = String.matches or error()
+local Rpc = require "luan:Rpc.luan"
+local LuceneIndex = require "java:luan.modules.lucene.LuceneIndex"
+local NumberFieldParser = require "java:luan.modules.lucene.queryparser.NumberFieldParser"
+local StringFieldParser = require "java:luan.modules.lucene.queryparser.StringFieldParser"
+local SaneQueryParser = require "java:luan.modules.lucene.queryparser.SaneQueryParser"
+local Version = require "java:org.apache.lucene.util.Version"
+local EnglishAnalyzer = require "java:org.apache.lucene.analysis.en.EnglishAnalyzer"
+
+
+local M = {}
+
+M.instances = {}
+
+M.type = {
+	string = LuceneIndex.STRING_FIELD_PARSER;
+	integer = NumberFieldParser.INT;
+	long = NumberFieldParser.LONG;
+	double = NumberFieldParser.DOUBLE;
+
+	english = StringFieldParser.new(EnglishAnalyzer.new(Version.LUCENE_CURRENT))
+}
+
+M.literal = SaneQueryParser.literal
+
+function M.index(index_dir,default_type,default_fields)
+	local index = {}
+	index.dir = index_dir
+	local java_index = LuceneIndex.new(index_dir,default_type,default_fields)
+	index.indexed_fields = java_index.indexedFieldsMeta.newTable()
+
+	-- index.indexed_only_fields[type][field] = fn(doc)
+	index.indexed_only_fields = java_index.indexed_only_fields
+
+	index.to_string = java_index.to_string
+--	index.backup = java_index.backup
+	index.snapshot = java_index.snapshot
+	index.advanced_search = java_index.advanced_search
+	index.search_in_transaction = java_index.search_in_transaction
+	index.delete_all = java_index.delete_all
+	index.delete = java_index.delete
+	index.save = java_index.save
+	index.update_in_transaction = java_index.update_in_transaction
+--	index.close = java_index.close
+	index.ensure_open = java_index.ensure_open
+	index.next_id = java_index.nextId
+	index.highlighter = java_index.highlighter
+
+	M.instances[index] = true
+
+	function index.close()
+		M.instances[index] = nil
+		java_index.close()
+	end
+
+	function index.search(query, from, to, sort)
+		from or error "missing 'from' parameter"
+		to or error "missing 'to' parameter"
+		local results = {}
+		local function fn(i,doc_fn)
+			if i >= from then
+				results[#results+1] = doc_fn()
+			end
+		end
+		local total_hits = index.advanced_search(query,fn,to,sort)
+		return results, total_hits
+	end
+
+	function index.get_document(query)
+		local doc
+		local function fn(_,doc_fn)
+			doc = doc_fn()
+		end
+		local total_hits = index.advanced_search(query,fn,1)
+		total_hits <= 1 or error( "found " .. total_hits .. " documents" )
+		return doc
+	end
+
+	function index.count(query)
+		return index.advanced_search(query)
+	end
+
+	function index.html_highlighter(query,formatter,container_tags)
+		local highlighter = index.highlighter(query,formatter)
+		return function(html)
+			local list = Html.parse(html,container_tags)
+			local result = {}
+			for _, obj in ipairs(list) do
+				if type(obj) == "string" then
+					obj = highlighter(obj)
+				end
+				result[#result+1] = obj
+			end
+			return Html.to_string(result)
+		end
+	end
+
+	function index.zip(zip_file)
+		index.snapshot( function(dir_path,file_names)
+			zip_file.delete()
+			local zip_path = zip_file.canonical().to_string()
+			local dir = uri("file:"..dir_path)
+			local dir_name = dir.name()
+			local options = {dir=dir.parent()}
+			for _, file_name in ipairs(file_names) do
+				local cmd = "zip "..zip_path.." "..dir_name.."/"..file_name
+				Io.uri("os:"..cmd,options).read_text()
+			end
+		end )
+	end
+
+	function index.restore(zip_file)
+		java_index.run_in_lock( function()
+			local lucene_dir = uri("file:"..index.dir)
+			local before_restore = lucene_dir.parent().child("before_restore.zip")
+			index.zip(before_restore)
+			java_index.close()
+			lucene_dir.delete()
+			Io.uri("os:unzip "..zip_file.canonical().to_string(),{dir=lucene_dir.parent()}).read_text()
+			java_index.reopen()
+		end )
+	end
+
+	local function multi_error()
+		error "multiple lucene instances"
+	end
+
+	if Rpc.functions.backup == nil then
+
+		function Rpc.functions.lucene_backup(password)
+			Io.password == password or error "wrong password"
+			local zip_file = uri("file:"..index.dir).parent().child("backup.zip")
+			index.zip(zip_file)
+			return zip_file
+		end
+
+		function Rpc.functions.lucene_restore(password,zip_file)
+			Io.password == password or error "wrong password"
+			local backup_zip = uri("file:"..index.dir).parent().child("backup.zip")
+			backup_zip.write(zip_file)
+			index.restore(backup_zip)
+		end
+
+	else
+		Rpc.functions.lucene_backup = multi_error
+		Rpc.functions.lucene_restore = multi_error
+	end
+
+	return index
+end
+
+return M