[exo-jcr-commits] exo-jcr SVN: r1287 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation.
do-not-reply at jboss.org
do-not-reply at jboss.org
Tue Jan 5 06:10:51 EST 2010
Author: sergiykarpenko
Date: 2010-01-05 06:10:51 -0500 (Tue, 05 Jan 2010)
New Revision: 1287
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
Log:
EXOJCR-302: getReferenceProperites fixed
Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java 2010-01-05 10:01:51 UTC (rev 1286)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java 2010-01-05 11:10:51 UTC (rev 1287)
@@ -30,6 +30,7 @@
import org.exoplatform.services.jcr.datamodel.QPath;
import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.persistent.ByteArrayPersistedValueData;
import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCStorageConnection;
import org.exoplatform.services.jcr.impl.storage.jdbc.PrimaryTypeNotFoundException;
import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
@@ -227,13 +228,16 @@
try
{
ResultSet refProps = findReferencePropertiesCQ(getInternalId(nodeIdentifier));
- List<PropertyData> references = new ArrayList<PropertyData>();
- while (refProps.next())
- {
- while (!refProps.isAfterLast())
- references.add(loadPropertyRecord(refProps, null));
- }
- return references;
+ // List<PropertyData> references = new ArrayList<PropertyData>();
+ //
+ //
+ // while (refProps.next())
+ // {
+ // while (!refProps.isAfterLast())
+ // references.add(loadPropertyRecord(refProps, null));
+ // }
+ // return references;
+ return loadReferences(refProps);
}
catch (SQLException e)
{
@@ -245,6 +249,107 @@
}
}
+ private List<PropertyData> loadReferences(ResultSet resultSet) throws RepositoryException, SQLException, IOException
+ {
+
+ List<PropertyData> resultProps = new ArrayList<PropertyData>();
+
+ // id and how many copies in result
+ Map<String, Integer> dublicatedProps = new HashMap<String, Integer>();
+
+ Map<String, PersistedPropertyData> propertyBuffer = new HashMap<String, PersistedPropertyData>();
+ Map<String, List<ValueData>> valuesBuffer = new HashMap<String, List<ValueData>>();
+
+ try
+ {
+ while (resultSet.next())
+ {
+ String cid = resultSet.getString(COLUMN_ID);
+ String identifier = getIdentifier(cid);
+ String cname = resultSet.getString(COLUMN_NAME);
+ int cversion = resultSet.getInt(COLUMN_VERSION);
+ String cpid = resultSet.getString(COLUMN_PARENTID);
+ int cptype = resultSet.getInt(COLUMN_PTYPE);
+ boolean cpmultivalued = resultSet.getBoolean(COLUMN_PMULTIVALUED);
+ QPath qpath = QPath.makeChildPath(traverseQPath(cpid), InternalQName.parse(cname));
+
+ int valueOrderNum = resultSet.getInt(COLUMN_VORDERNUM);
+ PersistedPropertyData prop = propertyBuffer.get(identifier);
+
+ if (prop == null)
+ {
+ // make temporary PropertyData without values
+ prop =
+ new PersistedPropertyData(identifier, qpath, getIdentifier(cpid), cversion, cptype, cpmultivalued,
+ null);
+ propertyBuffer.put(identifier, prop);
+ valuesBuffer.put(identifier, new ArrayList<ValueData>());
+ dublicatedProps.put(identifier, new Integer(1));
+ }
+
+ List<ValueData> values = valuesBuffer.get(identifier);
+ if (valueOrderNum == 0 && values.size() > 0)
+ {
+ // ignore it, this is a new copy
+ Integer copies = dublicatedProps.get(identifier);
+ copies++;
+ dublicatedProps.put(identifier, copies);
+ }
+ else if (values.size() <= valueOrderNum)
+ {
+ // read value and put into values buffer
+ final String storageId = resultSet.getString(COLUMN_VSTORAGE_DESC);
+ ValueData vdata =
+ resultSet.wasNull() ? readValueData(cid, valueOrderNum, cversion, resultSet
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, valueOrderNum, storageId);
+
+ values.add(vdata);
+ //TODO do we need reset values list into buffer?
+ valuesBuffer.put(identifier, values);
+ }
+ }
+
+ for (String id : propertyBuffer.keySet())
+ {
+
+ PersistedPropertyData prop = propertyBuffer.get(id);
+ List<ValueData> values = valuesBuffer.get(id);
+ int count = dublicatedProps.get(id).intValue();
+
+ for (int i = 0; i < count; i++)
+ {
+ //make a copy
+ List<ValueData> newValues = new ArrayList<ValueData>();
+ for (ValueData vd : values)
+ {
+ newValues.add(new ByteArrayPersistedValueData(vd.getOrderNumber(), vd.getAsByteArray()));
+ }
+
+ resultProps.add(new PersistedPropertyData(prop.getIdentifier(), prop.getQPath(), prop
+ .getParentIdentifier(), prop.getPersistedVersion(), prop.getType(), prop.isMultiValued(), newValues));
+ }
+
+ values.clear();
+ }
+
+ }
+ catch (IllegalNameException e)
+ {
+ throw new RepositoryException(e);
+ }
+ finally
+ {
+
+ // clean buffers
+ propertyBuffer.clear();
+ valuesBuffer.clear();
+ dublicatedProps.clear();
+ }
+
+ return resultProps;
+
+ }
+
protected List<AccessControlEntry> readACLPermisions(String cid, Map<String, List<byte[]>> properties)
throws SQLException, IllegalACLException
{
More information about the exo-jcr-commits
mailing list