[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