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) {