String identifier = getIdentifier(cid);
int cversion = resultSet.getInt(COLUMN_VERSION);
int valueOrderNum = resultSet.getInt(COLUMN_VORDERNUM);
PersistedPropertyData prop = propertyBuffer.get(identifier);
if (prop == null)
{
// make temporary PropertyData without values
String cname = resultSet.getString(COLUMN_NAME);
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));
prop =
new PersistedPropertyData(identifier, qpath, getIdentifier(cpid), cversion, cptype, cpmultivalued,
null); // null values!
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);
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()));
}
PersistedPropertyData pdata =
new PersistedPropertyData(prop.getIdentifier(), prop.getQPath(), prop.getParentIdentifier(), prop
.getPersistedVersion(), prop.getType(), prop.isMultiValued(), newValues);
resultProps.add(pdata);
}
values.clear();
}