Repository: jena Updated Branches: refs/heads/master 6570c25be -> 9e93ae9bb
Lucene index synchro on triple deletion on jena-text Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/a052b6d2 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/a052b6d2 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/a052b6d2 Branch: refs/heads/master Commit: a052b6d26c62a218c516aa64621d2505040be30a Parents: b06ed19 Author: Alexis Miara <[email protected]> Authored: Wed Apr 29 14:52:16 2015 -0400 Committer: Alexis Miara <[email protected]> Committed: Wed Apr 29 14:52:16 2015 -0400 ---------------------------------------------------------------------- .../jena/query/text/TextDocProducerTriples.java | 24 +++++++++---- .../org/apache/jena/query/text/TextIndex.java | 1 + .../apache/jena/query/text/TextIndexLucene.java | 38 +++++++++++++++++--- .../apache/jena/query/text/TextIndexSolr.java | 5 +++ 4 files changed, 58 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/a052b6d2/jena-text/src/main/java/org/apache/jena/query/text/TextDocProducerTriples.java ---------------------------------------------------------------------- diff --git a/jena-text/src/main/java/org/apache/jena/query/text/TextDocProducerTriples.java b/jena-text/src/main/java/org/apache/jena/query/text/TextDocProducerTriples.java index c0bcabd..51f5480 100644 --- a/jena-text/src/main/java/org/apache/jena/query/text/TextDocProducerTriples.java +++ b/jena-text/src/main/java/org/apache/jena/query/text/TextDocProducerTriples.java @@ -56,17 +56,29 @@ public class TextDocProducerTriples implements TextDocProducer { public void change(QuadAction qaction, Node g, Node s, Node p, Node o) { // One document per triple/quad - if ( qaction != QuadAction.ADD ) + if ( qaction != QuadAction.ADD && + qaction != QuadAction.DELETE ) return ; + Entity entity = TextQueryFuncs.entityFromQuad(defn, g, s, p, o) ; // Null means does not match defn if ( entity != null ) { - indexer.addEntity(entity) ; - - // Auto commit the entity if we aren't in a transaction - if (!inTransaction.get()) { - indexer.commit() ; + if (qaction == QuadAction.ADD) { + indexer.addEntity(entity); + + // Auto commit the entity if we aren't in a transaction + if (!inTransaction.get()) { + indexer.commit(); + } + } + else if (qaction == QuadAction.DELETE) { + indexer.deleteEntity(entity); + + // Auto commit the entity if we aren't in a transaction + if (!inTransaction.get()) { + indexer.commit(); + } } } } http://git-wip-us.apache.org/repos/asf/jena/blob/a052b6d2/jena-text/src/main/java/org/apache/jena/query/text/TextIndex.java ---------------------------------------------------------------------- diff --git a/jena-text/src/main/java/org/apache/jena/query/text/TextIndex.java b/jena-text/src/main/java/org/apache/jena/query/text/TextIndex.java index 69efb31..fcf72f3 100644 --- a/jena-text/src/main/java/org/apache/jena/query/text/TextIndex.java +++ b/jena-text/src/main/java/org/apache/jena/query/text/TextIndex.java @@ -36,6 +36,7 @@ public interface TextIndex extends Closeable //, Transactional // Update operations void addEntity(Entity entity) ; void updateEntity(Entity entity) ; + void deleteEntity(Entity entity) ; // read operations http://git-wip-us.apache.org/repos/asf/jena/blob/a052b6d2/jena-text/src/main/java/org/apache/jena/query/text/TextIndexLucene.java ---------------------------------------------------------------------- diff --git a/jena-text/src/main/java/org/apache/jena/query/text/TextIndexLucene.java b/jena-text/src/main/java/org/apache/jena/query/text/TextIndexLucene.java index 9107e86..b11f000 100644 --- a/jena-text/src/main/java/org/apache/jena/query/text/TextIndexLucene.java +++ b/jena-text/src/main/java/org/apache/jena/query/text/TextIndexLucene.java @@ -45,9 +45,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.queryparser.classic.ParseException ; import org.apache.lucene.queryparser.classic.QueryParser ; import org.apache.lucene.queryparser.classic.QueryParserBase ; -import org.apache.lucene.search.IndexSearcher ; -import org.apache.lucene.search.Query ; -import org.apache.lucene.search.ScoreDoc ; +import org.apache.lucene.search.*; import org.apache.lucene.store.Directory ; import org.apache.lucene.util.Version ; import org.slf4j.Logger ; @@ -77,6 +75,9 @@ public class TextIndexLucene implements TextIndex { private final Analyzer analyzer ; private final Analyzer queryAnalyzer ; + //the BORDER_DELIMITER constant is required for... + private static final String BORDER_DELIMITER = "borderdelimiter"; + // The IndexWriter can't be final because we may have to recreate it if rollback() is called. // However, it needs to be volatile in case the next write transaction is on a different thread, // but we do not need locking because we are assuming that there can only be one writer @@ -214,6 +215,35 @@ public class TextIndexLucene implements TextIndex { } } + @Override + public void deleteEntity(Entity entity) { + if ( log.isDebugEnabled() ) + log.debug("Delete entity: "+entity) ; + try { + TermQuery qUri = new TermQuery(new Term("uri", entity.getId())); + Map<String, Object> map = entity.getMap(); + String property = map.keySet().iterator().next(); + String value = (String)map.get(property); + + //escaping special characters to avoid problem in WildcardQuery + value = value.replace( "?", "\\?" ); + value = value.replace( "*", "\\*" ); + value = value.replace( "\"", "\\\"" ); + + QueryParser qp = new QueryParser(VER, property, analyzer); + Query qPropValue = qp.parse("\"" + BORDER_DELIMITER + " " + value + " " + BORDER_DELIMITER + "\""); + + BooleanQuery q = new BooleanQuery(); + q.add(qUri, BooleanClause.Occur.MUST); + q.add(qPropValue, BooleanClause.Occur.MUST); + + indexWriter.deleteDocuments(q); + + } catch (Exception e) { + throw new TextIndexException(e) ; + } + } + private Document doc(Entity entity) { Document doc = new Document() ; Field entField = new Field(docDef.getEntityField(), entity.getId(), ftIRI) ; @@ -226,7 +256,7 @@ public class TextIndexLucene implements TextIndex { } for ( Entry<String, Object> e : entity.getMap().entrySet() ) { - Field field = new Field(e.getKey(), (String)e.getValue(), ftText) ; + Field field = new Field(e.getKey(), BORDER_DELIMITER + " " + e.getValue() + " " + BORDER_DELIMITER, ftText) ; doc.add(field) ; } return doc ; http://git-wip-us.apache.org/repos/asf/jena/blob/a052b6d2/jena-text/src/main/java/org/apache/jena/query/text/TextIndexSolr.java ---------------------------------------------------------------------- diff --git a/jena-text/src/main/java/org/apache/jena/query/text/TextIndexSolr.java b/jena-text/src/main/java/org/apache/jena/query/text/TextIndexSolr.java index 54a3263..075eb49 100644 --- a/jena-text/src/main/java/org/apache/jena/query/text/TextIndexSolr.java +++ b/jena-text/src/main/java/org/apache/jena/query/text/TextIndexSolr.java @@ -104,6 +104,11 @@ public class TextIndexSolr implements TextIndex } catch (Exception e) { exception(e) ; } } + @Override + public void deleteEntity(Entity entity) { + //to be implemented + } + private SolrInputDocument solrDoc(Entity entity) { SolrInputDocument doc = new SolrInputDocument() ;
