Mercurial Hosting > luan
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