Mercurial Hosting > luan
view lucene/src/luan/modules/lucene/LuceneWriter.java @ 230:4438cb2e04d0
start lucene
git-svn-id: https://luan-java.googlecode.com/svn/trunk@231 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Tue, 30 Sep 2014 20:03:56 +0000 |
parents | |
children | ef39bc4d3f70 |
line wrap: on
line source
package luan.modules.lucene; import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.List; import java.util.ArrayList; import org.apache.lucene.index.IndexableField; import org.apache.lucene.index.Term; import luan.Luan; import luan.LuanState; import luan.LuanTable; import luan.LuanJavaFunction; import luan.LuanException; public final class LuceneWriter { public static final String FLD_TYPE = "type index"; public static final String FLD_ID = "id index"; private final LuceneIndex index; LuceneWriter(LuceneIndex index) { index.writeLock.lock(); this.index = index; } // call in finally block void close() { index.writeLock.unlock(); } void commit() throws IOException { index.writer.commit(); } void addDocument(LuanTable doc) throws IOException { index.writer.addDocument(LuceneDocument.toLucene(doc)); } void updateDocument(Term term,LuanTable doc) throws IOException { index.writer.updateDocument(term,LuceneDocument.toLucene(doc)); } public void delete_documents(LuanState luan,LuanTable tblTerms) throws LuanException, IOException { List<Term> list = new ArrayList<Term>(); for( Map.Entry<Object,Object> entry : tblTerms ) { Object key = entry.getKey(); Object value = entry.getValue(); if( !(key instanceof String) ) throw luan.exception("key must be a string but got "+key.getClass().getSimpleName()); if( !(value instanceof String) ) throw luan.exception("value must be a string but got "+value.getClass().getSimpleName()); list.add( new Term( (String)key, (String)value ) ); } index.writer.deleteDocuments(list.toArray(new Term[list.size()])); } String nextId() { return index.nextId(); } public void save_document(LuanTable doc) throws IOException { if( doc.get(FLD_TYPE)==null ) throw new RuntimeException("missing '"+FLD_TYPE+"'"); String id = (String)doc.get(FLD_ID); if( id == null ) { id = nextId(); doc.put(FLD_ID,id); addDocument(doc); } else { updateDocument(new Term(FLD_ID,id),doc); } } // luan private void add(LuanTable t,String method,Class<?>... parameterTypes) throws NoSuchMethodException { t.put( method, new LuanJavaFunction(LuceneWriter.class.getMethod(method,parameterTypes),this) ); } LuanTable table() { LuanTable tbl = Luan.newTable(); try { add( tbl, "save_document", LuanTable.class ); add( tbl, "delete_documents", LuanState.class, LuanTable.class ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); } return tbl; } }