Author: kmorin
Date: 2009-12-24 14:33:17 +0100 (Thu, 24 Dec 2009)
New Revision: 342
Modified:
wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/AbstractWikittyService.java
wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyProxy.java
wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittySearchEngine.java
wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyService.java
wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyServiceInMemory.java
wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyStorage.java
wikengo_core-wikitty/wikengo_core-wikitty-jdbc-impl/src/main/java/org/sharengo/wikitty/jdbc/WikittyStorageJDBC.java
wikengo_core-wikitty/wikengo_core-wikitty-solr-impl/src/main/java/org/sharengo/wikitty/solr/WikittySearchEngineSolr.java
Log:
- add index synchronisation method (to fix)
- add restore node method
Modified: wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/AbstractWikittyService.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/AbstractWikittyService.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/AbstractWikittyService.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -26,20 +26,8 @@
import java.io.StringWriter;
import java.io.Writer;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.Map.Entry;
-import java.util.Set;
-import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -341,21 +329,41 @@
return tree;
}
+ public Map.Entry<TreeNode, Integer> restoreNode(String wikittyId) {
+ Wikitty w = restore(wikittyId);
+ if(w == null) {
+ return null;
+ }
+
+ if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) {
+ throw new WikittyException(String.format(
+ "Wikitty '%s' do not handle extension %s",
+ wikittyId, TreeNode.EXT_TREENODE ));
+ }
+
+ TreeNode node = new TreeNodeImpl(w);
+ Integer count = getSearchEngine().findNodeCount(w);
+
+ HashMap.SimpleEntry<TreeNode, Integer> result =
+ new AbstractMap.SimpleEntry<TreeNode, Integer>(node, count);
+ return result;
+ }
+
public Map<TreeNode, Integer> restoreChildren(String wikittyId) {
Wikitty w = restore(wikittyId);
if(w == null) {
return null;
}
- if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) {
- throw new WikittyException(String.format(
+ if ( !w.hasExtension(TreeNode.EXT_TREENODE) ) {
+ throw new WikittyException(String.format(
"Wikitty '%s' do not handle extension %s",
wikittyId, TreeNode.EXT_TREENODE ));
- }
+ }
Map<TreeNode, Integer> result = new LinkedHashMap<TreeNode, Integer>();
- Map<String, Integer> search = getSearchEngine().findAllChildren(w);
+ Map<String, Integer> search = getSearchEngine().findAllChildrenCount(w);
Set<Entry<String, Integer>> children = search.entrySet();
for (Entry<String, Integer> child : children) {
Integer count = child.getValue();
@@ -374,6 +382,49 @@
throw new UnsupportedOperationException("Not supported yet.");
}
+ public UpdateResponse syncEngin() {
+ final int numberForCommit = 1000;
+ final WikittySearchEngine searchEngine = getSearchEngine();
+ final UpdateResponse result = new UpdateResponse();
+ final List<Wikitty> wikitties = new ArrayList<Wikitty>(numberForCommit);
+
+ searchEngine.clear();
+ getWikittyStorage().scanWikitties(new WikittyStorage.Scanner() {
+
+ WikittyTransaction transaction = new WikittyTransaction();
+ int count = 0;
+
+ @Override
+ public void scan(Wikitty wikitty) {
+ Date deleteDate = wikitty.getDeleteDate();
+ if(deleteDate == null) {
+ count ++;
+ wikitties.add(wikitty);
+
+ if(count == numberForCommit) {
+ // Reindex
+ List<WikittySearchEngine.Command> commands = searchEngine.prepare(transaction, wikitties);
+ UpdateResponse response = searchEngine.commit(transaction, commands);
+ result.add(response);
+
+ // Reinit
+ count = 0;
+ wikitties.clear();
+ transaction = new WikittyTransaction();
+ }
+ }
+ }
+ });
+
+ // Last wikitties
+ WikittyTransaction transaction = new WikittyTransaction();
+ List<WikittySearchEngine.Command> commands = searchEngine.prepare(transaction, wikitties);
+ UpdateResponse response = searchEngine.commit(transaction, commands);
+ result.add(response);
+
+ return result;
+ }
+
/**
* Class used for import process, this class retain numberForCommit object
* before to send it to storage.
Modified: wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyProxy.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyProxy.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyProxy.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -17,15 +17,9 @@
package org.sharengo.wikitty;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.Map.Entry;
-import java.util.Set;
+
import org.sharengo.wikitty.search.Element;
import org.sharengo.wikitty.search.Search;
@@ -271,8 +265,33 @@
Tree result = wikittyService.restoreTree(wikittyId);
return result;
}
+ public <E extends BusinessEntity> Map.Entry<E, Integer> restoreNode(Class<E> clazz, String wikittyId) {
+ Entry<E, Integer> result = restoreNode(clazz, wikittyId, false);
+ return result;
+ }
+ public <E extends BusinessEntity> Map.Entry<E, Integer> restoreNode(Class<E> clazz, String wikittyId, boolean checkExtension) {
+ Map.Entry<TreeNode, Integer> node = wikittyService.restoreNode(wikittyId);
+ if(node == null) {
+ return null;
+ }
+
+ E bean = restore(clazz, wikittyId, checkExtension);
+ if(bean == null) {
+ return null;
+ }
+
+ Map.Entry<E, Integer> result =
+ new HashMap.SimpleEntry<E, Integer>(bean, node.getValue());
+ return result;
+ }
+
public <E extends BusinessEntity> Map<E, Integer> restoreChildren(Class<E> clazz, String wikittyId) {
+ Map<E, Integer> result = restoreChildren(clazz, wikittyId, false);
+ return result;
+ }
+
+ public <E extends BusinessEntity> Map<E, Integer> restoreChildren(Class<E> clazz, String wikittyId, boolean checkExtension) {
Map<TreeNode, Integer> result = wikittyService.restoreChildren(wikittyId);
if(result == null) {
return null;
Modified: wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittySearchEngine.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittySearchEngine.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittySearchEngine.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -75,12 +75,19 @@
public PagedResult<String> findAllByCriteria(Criteria criteria);
+ /**
+ * Find count of child for a node
+ * @param w
+ * @return
+ */
+ public Integer findNodeCount(Wikitty w);
+
/**
* Find all children ids with count for a node wikitty.
* @param w
* @return
*/
- public Map<String, Integer> findAllChildren(Wikitty w);
+ public Map<String, Integer> findAllChildrenCount(Wikitty w);
/**
* Command update
Modified: wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyService.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyService.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyService.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -17,7 +17,6 @@
package org.sharengo.wikitty;
-import javax.swing.tree.TreeNode;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -185,13 +184,21 @@
Tree restoreTree(String wikittyId);
/**
+ * Retrieve wikitty node with count. Wikitty reference by wikittyId MUST
+ * include the 'Node' extension
+ * @param wikittyId
+ * @return
+ */
+ Map.Entry<TreeNode, Integer> restoreNode(String wikittyId);
+
+ /**
* Retrieve all wikitties children with count (no recursively) of an other one
* Wikitty reference by wikittyId MUST include the 'Node' extension
*
* @param wikittyId
* @return
*/
- Map<org.sharengo.wikitty.TreeNode, Integer> restoreChildren(String wikittyId);
+ Map<TreeNode, Integer> restoreChildren(String wikittyId);
/*
@@ -203,6 +210,17 @@
*/
Wikitty restoreVersion(String wikittyId, String version);
+ /*
+ * admin
+ */
+
+ /**
+ * Synchronise search engine with wikitty strorage engine, i.e. clear and
+ * reindex all wikitties.
+ * @return
+ */
+ UpdateResponse syncEngin();
+
/*
* Import / Export
*/
Modified: wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyServiceInMemory.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyServiceInMemory.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyServiceInMemory.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -143,6 +143,16 @@
return result;
}
+ /**
+ * Scan all wikitties with specific scanner, even if the wikitty is deleted
+ *
+ * @param scanner scanner
+ */
+ @Override
+ public void scanWikitties(Scanner scanner) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
class CommandInMemory implements Command {
/** if true command is for storage, if false for deletion */
boolean toStore;
Modified: wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyStorage.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyStorage.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-api/src/main/java/org/sharengo/wikitty/WikittyStorage.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -93,4 +93,17 @@
*/
static public interface Command {}
+ /**
+ * Scan all wikitties with specific scanner, even if the wikitty is deleted
+ * @param scanner scanner
+ */
+ void scanWikitties(Scanner scanner);
+
+ /**
+ * Call each time wikitty is scan
+ */
+ public static interface Scanner {
+ void scan(Wikitty wikitty);
+ }
+
}
Modified: wikengo_core-wikitty/wikengo_core-wikitty-jdbc-impl/src/main/java/org/sharengo/wikitty/jdbc/WikittyStorageJDBC.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-jdbc-impl/src/main/java/org/sharengo/wikitty/jdbc/WikittyStorageJDBC.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-jdbc-impl/src/main/java/org/sharengo/wikitty/jdbc/WikittyStorageJDBC.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -45,6 +45,7 @@
* JDBC driver property name
*/
static protected String driver = "jdbc.con.driver";
+
/**
* wikitty_admin table creation query property name
*/
@@ -54,6 +55,10 @@
*/
static protected String wikittyDataCreationQ = "jdbc.queries.creation.wikitty.data";
/**
+ * basic selection without where clause query property name
+ */
+ static protected String selectionQ = "jdbc.queries.select";
+ /**
* basic selection with where clause query property name
*/
static protected String whereSelectionQ = "jdbc.queries.select.where";
@@ -679,4 +684,32 @@
return result;
}
+
+ @Override
+ public void scanWikitties(Scanner scanner) {
+ Connection con = null;
+ try {
+ con = getConnection();
+ Statement statement = con.createStatement();
+ //select the data with the id "id" in the admin table
+ ResultSet adminResultSet = statement.executeQuery(
+ String.format(conf.getProperty(selectionQ), "*",
+ adminTable));
+ adminResultSet.beforeFirst();
+ while(adminResultSet.next()) {
+ String id = adminResultSet.getString(COL_ID);
+ String version = adminResultSet.getString(COL_VERSION);
+ String extensionList = adminResultSet.getString(COL_EXTENSION);
+ //select the data with the id "id" in the data table
+ ResultSet dataResultSet = statement.executeQuery(
+ String.format(conf.getProperty(whereSelectionQ), "*",
+ dataTable, COL_ID, "'" + id + "'"));
+ Wikitty result = constructWikitty(id, version, extensionList,
+ dataResultSet);
+ scanner.scan(result);
+ }
+ } catch (Exception eee) {
+ throw new WikittyException("Can't restore wikitties", eee);
+ }
+ }
}
Modified: wikengo_core-wikitty/wikengo_core-wikitty-solr-impl/src/main/java/org/sharengo/wikitty/solr/WikittySearchEngineSolr.java
===================================================================
--- wikengo_core-wikitty/wikengo_core-wikitty-solr-impl/src/main/java/org/sharengo/wikitty/solr/WikittySearchEngineSolr.java 2009-12-23 15:32:17 UTC (rev 341)
+++ wikengo_core-wikitty/wikengo_core-wikitty-solr-impl/src/main/java/org/sharengo/wikitty/solr/WikittySearchEngineSolr.java 2009-12-24 13:33:17 UTC (rev 342)
@@ -492,8 +492,26 @@
}
}
- public Map<String, Integer> findAllChildren(Wikitty w) {
+ public Integer findNodeCount(Wikitty w) {
String wikittyId = w.getId();
+
+ String parent = w.getFieldAsWikitty(TreeNode.EXT_TREENODE, TreeNode.FIELD_PARENT);
+ if(parent == null) {
+ parent = TREENODE_ROOT;
+ } else {
+ parent = TREENODE_PREFIX + parent;
+ }
+
+ Criteria criteria = Search.query().eq(parent, wikittyId).criteria()
+ .setFirstIndex(0).setEndIndex(0);
+ PagedResult<String> search = findAllByCriteria(criteria);
+
+ int numFound = search.getNumFound();
+ return numFound;
+ }
+
+ public Map<String, Integer> findAllChildrenCount(Wikitty w) {
+ String wikittyId = w.getId();
String parent = w.getFieldAsWikitty(TreeNode.EXT_TREENODE, TreeNode.FIELD_PARENT);
if(parent == null) {