Author: tolusha
Date: 2011-09-29 06:18:52 -0400 (Thu, 29 Sep 2011)
New Revision: 5000
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java
Log:
EXOJCR-1506: improve RDBMS reindexin for MSSQL
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java 2011-09-29
06:52:50 UTC (rev 4999)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java 2011-09-29
10:18:52 UTC (rev 5000)
@@ -156,4 +156,12 @@
{
return nodeData.getACL();
}
+
+ /**
+ * Indicates if all properties was read from storage.
+ */
+ public boolean containAllProperties()
+ {
+ return properties != null;
+ }
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java 2011-09-29
06:52:50 UTC (rev 4999)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java 2011-09-29
10:18:52 UTC (rev 5000)
@@ -310,7 +310,7 @@
// seems nt:file found, try for nt:resource props
PropertyData pmime = node.getProperty(Constants.JCR_MIMETYPE.getAsString());
- if (pmime == null)
+ if (pmime == null && !node.containAllProperties())
{
pmime =
(PropertyData)stateProvider.getItemData(node, new
QPathEntry(Constants.JCR_MIMETYPE, 0),
@@ -342,7 +342,7 @@
// check the jcr:encoding property
PropertyData encProp =
node.getProperty(Constants.JCR_ENCODING.getAsString());
- if (encProp == null)
+ if (encProp == null && !node.containAllProperties())
{
encProp =
(PropertyData)stateProvider.getItemData(node, new
QPathEntry(Constants.JCR_ENCODING, 0),
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-09-29
06:52:50 UTC (rev 4999)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-09-29
10:18:52 UTC (rev 5000)
@@ -1086,15 +1086,7 @@
}
/**
- * GetNodesAndProperties.
- *
- * @param lastNodeId the id if the last doc get from the db
- * @param offset
- * @param limit
- * @param result
- * @return
- * @throws RepositoryException
- * @throws IllegalStateException
+ * Returns from storage the next page of nodes and its properties.
*/
public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int
offset, int limit)
throws RepositoryException, IllegalStateException
@@ -1105,6 +1097,7 @@
try
{
ResultSet resultSet = findNodesAndProperties(lastNodeId, offset, limit);
+ int processed = 0;
try
{
@@ -1115,26 +1108,35 @@
if (tempNodeData == null)
{
tempNodeData = new TempNodeData(resultSet);
+ processed++;
}
else if (!resultSet.getString(COLUMN_ID).equals(tempNodeData.cid))
{
- result.add(createNodeDataIndexing(tempNodeData));
+ if (!needToSkipOffsetNodes() || processed > offset)
+ {
+ result.add(createNodeDataIndexing(tempNodeData));
+ }
+
tempNodeData = new TempNodeData(resultSet);
+ processed++;
}
- String key = resultSet.getString("P_NAME");
+ if (!needToSkipOffsetNodes() || processed > offset)
+ {
+ String key = resultSet.getString("P_NAME");
- SortedSet<TempPropertyData> values =
tempNodeData.properties.get(key);
- if (values == null)
- {
- values = new TreeSet<TempPropertyData>();
- tempNodeData.properties.put(key, values);
+ SortedSet<TempPropertyData> values =
tempNodeData.properties.get(key);
+ if (values == null)
+ {
+ values = new TreeSet<TempPropertyData>();
+ tempNodeData.properties.put(key, values);
+ }
+
+ values.add(new ExtendedTempPropertyData(resultSet));
}
-
- values.add(new ExtendedTempPropertyData(resultSet));
}
- if (tempNodeData != null)
+ if (tempNodeData != null && (!needToSkipOffsetNodes() || processed
> offset))
{
result.add(createNodeDataIndexing(tempNodeData));
}
@@ -1168,6 +1170,15 @@
}
/**
+ * Some implementations could require to skip first 'offset' nodes from
+ * result set.
+ */
+ protected boolean needToSkipOffsetNodes()
+ {
+ return false;
+ }
+
+ /**
*
* @param parent
* @param lastOrderNum
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java 2011-09-29
06:52:50 UTC (rev 4999)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java 2011-09-29
10:18:52 UTC (rev 5000)
@@ -129,6 +129,6 @@
@Override
public boolean isIDNeededForPaging()
{
- return false;
+ return true;
}
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java 2011-09-29
06:52:50 UTC (rev 4999)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java 2011-09-29
10:18:52 UTC (rev 5000)
@@ -32,6 +32,13 @@
*/
public class MSSQLMultiDbJDBCConnection extends MultiDbJDBCConnection
{
+ public static final String FIND_NODES_AND_PROPERTIES_TEMPLATE =
+ "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE,
P.P_MULTIVALUED,"
+ + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_MVALUE V WITH (INDEX
(jcr_idx_mvalue_property)), JCR_MITEM P "
+ + " join (select TOP ${TOP} I.ID, I.PARENT_ID, I.NAME, I.VERSION,
I.I_INDEX, I.N_ORDER_NUM from JCR_MITEM I WITH (INDEX (jcr_pk_mitem))"
+ + " where I.I_CLASS=1 AND I.ID > ? order by I.ID) J on P.PARENT_ID =
J.ID"
+ + " where P.I_CLASS=2 and V.PROPERTY_ID=P.ID order by J.ID";
+
/**
* MSSQL Multidatabase JDBC Connection constructor.
*
@@ -67,13 +74,6 @@
protected void prepareQueries() throws SQLException
{
super.prepareQueries();
- FIND_NODES_AND_PROPERTIES =
- "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION,
P.P_TYPE, P.P_MULTIVALUED,"
- + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_MVALUE V, JCR_MITEM
P"
- + " join (select A.* from"
- + " (select Row_Number() over (order by I.ID) as r__, I.ID, I.PARENT_ID,
I.NAME, I.VERSION, I.I_INDEX, I.N_ORDER_NUM"
- + " from JCR_MITEM I where I.I_CLASS=1) as A where A.r__ <= ? and
A.r__ > ?) J on P.PARENT_ID = J.ID"
- + " where P.I_CLASS=2 and V.PROPERTY_ID=P.ID order by J.ID";
}
/**
@@ -82,22 +82,29 @@
@Override
protected ResultSet findNodesAndProperties(String lastNodeId, int offset, int limit)
throws SQLException
{
- if (findNodesAndProperties == null)
+ if (findNodesAndProperties != null)
{
- findNodesAndProperties =
dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES);
+ findNodesAndProperties.close();
}
- else
- {
- findNodesAndProperties.clearParameters();
- }
- findNodesAndProperties.setInt(1, offset + limit);
- findNodesAndProperties.setInt(2, offset);
+ findNodesAndProperties =
+
dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES_TEMPLATE.replace("${TOP}",
+ new Integer(offset + limit).toString()));
+ findNodesAndProperties.setString(1, getInternalId(lastNodeId));
+
return findNodesAndProperties.executeQuery();
}
/**
+ * {@inheritDoc}
+ */
+ protected boolean needToSkipOffsetNodes()
+ {
+ return true;
+ }
+
+ /**
* Replace underscore in pattern with escaped symbol. Replace jcr-wildcard '*'
with sql-wildcard '%'.
* <p>
* MSSQL have a range pattern '[..]' so we need to escape it too.
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java 2011-09-29
06:52:50 UTC (rev 4999)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java 2011-09-29
10:18:52 UTC (rev 5000)
@@ -34,6 +34,13 @@
*/
public class MSSQLSingleDbJDBCConnection extends SingleDbJDBCConnection
{
+ private static final String FIND_NODES_AND_PROPERTIES_TEMPLATE =
+ "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE,
P.P_MULTIVALUED,"
+ + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_SVALUE V WITH (INDEX
(jcr_idx_svalue_property)), JCR_SITEM P "
+ + " join (select TOP ${TOP} I.ID, I.PARENT_ID, I.NAME, I.VERSION,
I.I_INDEX, I.N_ORDER_NUM from JCR_SITEM I WITH (INDEX (jcr_pk_sitem))"
+ + " where I.CONTAINER_NAME=? AND I.I_CLASS=1 AND I.ID > ? order by I.ID)
J on P.PARENT_ID = J.ID"
+ + " where P.I_CLASS=2 and P.CONTAINER_NAME=? and V.PROPERTY_ID=P.ID order
by J.ID";
+
/**
* MSSQL Singledatabase JDBC Connection constructor.
*
@@ -66,43 +73,33 @@
* {@inheritDoc}
*/
@Override
- protected void prepareQueries() throws SQLException
- {
- super.prepareQueries();
- FIND_NODES_AND_PROPERTIES =
- "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION,
P.P_TYPE, P.P_MULTIVALUED,"
- + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_SVALUE V, JCR_SITEM
P"
- + " join (select A.* from"
- + " (select Row_Number() over (order by I.ID) as r__, I.ID, I.PARENT_ID,
I.NAME, I.VERSION, I.I_INDEX, I.N_ORDER_NUM"
- + " from JCR_SITEM I where I.CONTAINER_NAME=? and I.I_CLASS=1) as A
where A.r__ <= ? and A.r__ > ?"
- + " ) J on P.PARENT_ID = J.ID"
- + " where P.I_CLASS=2 and P.CONTAINER_NAME=? and V.PROPERTY_ID=P.ID
order by J.ID";
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
protected ResultSet findNodesAndProperties(String lastNodeId, int offset, int limit)
throws SQLException
{
- if (findNodesAndProperties == null)
+ if (findNodesAndProperties != null)
{
- findNodesAndProperties =
dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES);
+ findNodesAndProperties.close();
}
- else
- {
- findNodesAndProperties.clearParameters();
- }
+ findNodesAndProperties =
+
dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES_TEMPLATE.replace("${TOP}",
+ new Integer(offset + limit).toString()));
+
findNodesAndProperties.setString(1, containerName);
- findNodesAndProperties.setInt(2, offset + limit);
- findNodesAndProperties.setInt(3, offset);
- findNodesAndProperties.setString(4, containerName);
+ findNodesAndProperties.setString(2, getInternalId(lastNodeId));
+ findNodesAndProperties.setString(3, containerName);
return findNodesAndProperties.executeQuery();
}
/**
+ * {@inheritDoc}
+ */
+ protected boolean needToSkipOffsetNodes()
+ {
+ return true;
+ }
+
+ /**
* Replace underscore in pattern with escaped symbol. Replace jcr-wildcard '*'
with sql-wildcard '%'.
* <p>
* MSSQL have a range pattern '[..]' so we need to escape it too.