Skip to content

Commit

Permalink
fix bug on peristed document inside a embeddedmap, issue #2660
Browse files Browse the repository at this point in the history
  • Loading branch information
tglman committed Sep 12, 2014
1 parent 8848e15 commit 2f3aa1f
Show file tree
Hide file tree
Showing 12 changed files with 123 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ public enum OGlobalConfiguration {

DB_VALIDATION("db.validation", "Enables or disables validation of records", Boolean.class, true),

@Deprecated
DB_USE_DISTRIBUTED_VERSION("db.use.distributedVersion", "Use extended version that is safe in distributed environment",
Boolean.class, Boolean.FALSE),

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public Map<Object, T> returnOriginalState(final List<OMultiValueChangeEvent<Obje

while (listIterator.hasPrevious()) {
final OMultiValueChangeEvent<Object, T> event = listIterator.previous();
switch (event.getChangeType()) {
switch (event.getChangeType()) {
case ADD:
reverted.remove(event.getKey());
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@
*/
package com.orientechnologies.orient.core.db.record;

import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
Expand All @@ -28,7 +25,6 @@
import java.util.Set;
import java.util.WeakHashMap;

import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.ORecordInternal;
import com.orientechnologies.orient.core.record.impl.ODocument;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,41 @@
*/
package com.orientechnologies.orient.core.record.impl;

import java.lang.reflect.Array;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.orientechnologies.common.collection.OMultiValue;
import com.orientechnologies.common.util.OPair;
import com.orientechnologies.orient.core.Orient;
import com.orientechnologies.orient.core.command.OCommandContext;
import com.orientechnologies.orient.core.config.OGlobalConfiguration;
import com.orientechnologies.orient.core.config.OStorageConfiguration;
import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal;
import com.orientechnologies.orient.core.db.record.*;
import com.orientechnologies.orient.core.db.record.ODatabaseRecord;
import com.orientechnologies.orient.core.db.record.OIdentifiable;
import com.orientechnologies.orient.core.db.record.ORecordElement.STATUS;
import com.orientechnologies.orient.core.db.record.ORecordLazyList;
import com.orientechnologies.orient.core.db.record.ORecordLazyMap;
import com.orientechnologies.orient.core.db.record.ORecordLazyMultiValue;
import com.orientechnologies.orient.core.db.record.ORecordLazySet;
import com.orientechnologies.orient.core.db.record.ORecordTrackedList;
import com.orientechnologies.orient.core.db.record.ORecordTrackedSet;
import com.orientechnologies.orient.core.db.record.OTrackedList;
import com.orientechnologies.orient.core.db.record.OTrackedMap;
import com.orientechnologies.orient.core.db.record.OTrackedSet;
import com.orientechnologies.orient.core.db.record.ridbag.ORidBag;
import com.orientechnologies.orient.core.exception.OQueryParsingException;
import com.orientechnologies.orient.core.id.ORID;
Expand All @@ -39,13 +65,6 @@
import com.orientechnologies.orient.core.type.tree.OMVRBTreeRIDSet;
import com.orientechnologies.orient.core.version.ODistributedVersion;

import java.lang.reflect.Array;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;

/**
* Helper class to manage documents.
*
Expand Down Expand Up @@ -756,6 +775,11 @@ public static void copyFieldValue(final ODocument iCloned, final Entry<String, O
} else if (fieldValue instanceof OMVRBTreeRIDSet) {
iCloned._fieldValues.put(iEntry.getKey(), ((OMVRBTreeRIDSet) fieldValue).copy(iCloned));

} else if (fieldValue instanceof ORecordLazySet) {
final ORecordLazySet newList = new ORecordLazySet(iCloned);
newList.addAll((ORecordLazySet) fieldValue);
iCloned._fieldValues.put(iEntry.getKey(), newList);

} else if (fieldValue instanceof ORecordTrackedSet) {
final ORecordTrackedSet newList = new ORecordTrackedSet(iCloned);
newList.addAll((ORecordTrackedSet) fieldValue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ private int writeEmbeddedMap(BytesContainer bytes, Map<Object, Object> map) {
int pointer = 0;
Object value = values[i].getValue();
if (value != null) {
OType type = getTypeFromValue(value, true);
OType type = getTypeFromValueEmbedded(value);
// temporary skip serialization of unknown types
if (type == null)
continue;
Expand Down Expand Up @@ -589,7 +589,7 @@ private int writeEmbeddedCollection(BytesContainer bytes, Collection<?> value, O
}
OType type;
if (linkedType == null)
type = getTypeFromValue(itemValue, true);
type = getTypeFromValueEmbedded(itemValue);
else
type = linkedType;
if (type != null) {
Expand All @@ -609,14 +609,14 @@ private OType getFieldType(final ODocument document, final String key, final Obj
type = prop.getType();

if (type == null || OType.ANY == type)
type = getTypeFromValue(fieldValue, false);
type = OType.getTypeByValue(fieldValue);
}
return type;
}

private OType getTypeFromValue(final Object fieldValue, final boolean forceEmbedded) {
private OType getTypeFromValueEmbedded(final Object fieldValue) {
OType type = OType.getTypeByValue(fieldValue);
if (type == OType.LINK && fieldValue instanceof ODocument && forceEmbedded)
if (type == OType.LINK && fieldValue instanceof ODocument && !((ODocument) fieldValue).getIdentity().isValid())
type = OType.EMBEDDED;
return type;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,9 @@ public void embeddedMapToStream(ODatabaseComplex<?> iDatabase, final OUserObject
fieldTypeToString(iOutput, OType.STRING, o.getKey());
iOutput.append(OStringSerializerHelper.ENTRY_SEPARATOR);

if (o.getValue() instanceof ORecord<?> || o.getValue() instanceof ODocumentSerializable) {
if (o.getValue() instanceof ODocument && ((ODocument) o.getValue()).getIdentity().isValid()) {
fieldTypeToString(iOutput, OType.LINK, o.getValue());
} else if (o.getValue() instanceof ORecord<?> || o.getValue() instanceof ODocumentSerializable) {
final ODocument record;
if (o.getValue() instanceof ODocument)
record = (ODocument) o.getValue();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.orientechnologies.orient.core.db.record;

import java.util.List;
import java.util.Map;

import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;

public class TestLinkedDocumentInMap {

private ODatabaseDocumentTx db;

@BeforeMethod
public void create() {
db = new ODatabaseDocumentTx("memory:" + TestLinkedDocumentInMap.class.getSimpleName());
db.create();

}

@Test
public void testLinkedValue() {

db.getMetadata().getSchema().createClass("PersonTest");
db.command(new OCommandSQL("delete from PersonTest")).execute();
ODocument jaimeDoc = new ODocument("PersonTest");
jaimeDoc.field("name", "jaime");
jaimeDoc.save();

ODocument tyrionDoc = new ODocument("PersonTest");
tyrionDoc.fromJSON("{\"@type\":\"d\",\"name\":\"tyrion\",\"emergency_contact\":[{\"relationship\":\"brother\",\"contact\":"
+ jaimeDoc.toJSON() + "}]}");
tyrionDoc.save();
List<Map<String, OIdentifiable>> res = tyrionDoc.field("emergency_contact");
Map<String, OIdentifiable> doc = res.get(0);
Assert.assertTrue(doc.get("contact").getIdentity().isValid());
System.out.println(db.load(tyrionDoc.getIdentity()).toJSON());

db.close();
db.open("admin", "admin");
List<ODocument> result = db.query(new OSQLSynchQuery<ODocument>("select from " + tyrionDoc.getIdentity()));
res = result.get(0).field("emergency_contact");
doc = res.get(0);
System.out.println(db.load(tyrionDoc.getIdentity()).toJSON());
System.out.println(doc.get("contact").getIdentity());
Assert.assertTrue(doc.get("contact").getIdentity().isValid());

}

@AfterMethod
public void after() {
db.drop();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
import java.util.List;
import java.util.Map;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.orientechnologies.orient.core.config.OGlobalConfiguration;
import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal;
import com.orientechnologies.orient.core.db.document.ODatabaseDocument;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
Expand All @@ -22,6 +23,7 @@
import com.orientechnologies.orient.core.metadata.schema.OSchema;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.serialization.serializer.record.ORecordSerializer;
import com.orientechnologies.orient.core.serialization.serializer.record.ORecordSerializerFactory;
import com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV;

public class ODocumentSchemafullSerializationTest {
Expand Down Expand Up @@ -60,7 +62,6 @@ public class ODocumentSchemafullSerializationTest {
private static final String EMBEDDED_FIELD = "embeddedField";
private ODatabaseDocument databaseDocument;
private OClass simple;
private ORecordSerializer defaultSerializer;
private ORecordSerializer serializer;
private OClass embSimp;
private OClass address;
Expand All @@ -74,9 +75,8 @@ public ODocumentSchemafullSerializationTest() {
this(new ORecordSerializerSchemaAware2CSV());
}

@BeforeTest
@BeforeMethod
public void before() {
defaultSerializer = ODatabaseDocumentTx.getDefaultSerializer();
ODatabaseDocumentTx.setDefaultSerializer(serializer);
databaseDocument = new ODatabaseDocumentTx("memory:" + ODocumentSchemafullSerializationTest.class.getSimpleName()).create();
// databaseDocument.getMetadata().
Expand Down Expand Up @@ -127,10 +127,11 @@ public void before() {
clazzEmbComp.createProperty("addressByStreet", OType.EMBEDDEDMAP, address);
}

@AfterTest
@AfterMethod
public void after() {
databaseDocument.drop();
ODatabaseDocumentTx.setDefaultSerializer(defaultSerializer);
ODatabaseDocumentTx.setDefaultSerializer(ORecordSerializerFactory.instance().getFormat(
OGlobalConfiguration.DB_DOCUMENT_SERIALIZER.getValueAsString()));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
import java.util.Map;
import java.util.Set;

import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

Expand All @@ -36,13 +38,13 @@ public ODocumentSchemalessSerializationTest() {
this(new ORecordSerializerSchemaAware2CSV());
}

@BeforeTest
@BeforeClass
public void before() {
defaultSerializer = ODatabaseDocumentTx.getDefaultSerializer();
ODatabaseDocumentTx.setDefaultSerializer(serializer);
}

@AfterTest
@AfterClass
public void after() {
ODatabaseDocumentTx.setDefaultSerializer(defaultSerializer);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ public class ODocumentSerializationPersistentTest {

@BeforeMethod
public void setUp() throws Exception {
OGlobalConfiguration.DB_USE_DISTRIBUTED_VERSION.setValue(Boolean.TRUE);

db = new ODatabaseDocumentTx("memory:testdocumentserialization");
db.create();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.orientechnologies.orient.core.db.OUserObject2RecordHandler;
import com.orientechnologies.orient.core.db.object.ODatabaseObject;
import com.orientechnologies.orient.core.db.record.ORecordElement;
import com.orientechnologies.orient.core.db.record.ORecordLazySet;
import com.orientechnologies.orient.core.db.record.OTrackedList;
import com.orientechnologies.orient.core.db.record.OTrackedMap;
import com.orientechnologies.orient.core.db.record.OTrackedMultiValue;
Expand Down Expand Up @@ -784,7 +785,7 @@ else if (iMultiValue instanceof Set)
if (iRecord != null && iType.equals(OType.EMBEDDEDSET))
result = new OTrackedSet<Object>(iRecord);
else
result = new HashSet<Object>();
result = new ORecordLazySet(iRecord);
} else if (iType.equals(OType.EMBEDDEDLIST) || iType.equals(OType.LINKLIST)) {
if (iRecord != null && iType.equals(OType.EMBEDDEDLIST))
result = new OTrackedList<Object>(iRecord);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.exception.OConfigurationException;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.serialization.serializer.record.ORecordSerializer;
import com.orientechnologies.orient.core.serialization.serializer.record.binary.ORecordSerializerBinary;
import com.orientechnologies.orient.core.serialization.serializer.record.string.ORecordSerializerSchemaAware2CSV;
import com.orientechnologies.orient.server.OServer;
Expand All @@ -31,7 +32,7 @@ public void before() throws Exception {

@Test
public void createCsvDatabaseConnectBinary() throws IOException {

ORecordSerializer prev = ODatabaseDocumentTx.getDefaultSerializer();
ODatabaseDocumentTx.setDefaultSerializer(ORecordSerializerSchemaAware2CSV.INSTANCE);
createDatabase();

Expand All @@ -53,6 +54,7 @@ public void createCsvDatabaseConnectBinary() throws IOException {
if (dbTx != null)
dbTx.close();
dropDatabase();
ODatabaseDocumentTx.setDefaultSerializer(prev);
}
}

Expand All @@ -70,7 +72,7 @@ private void createDatabase() throws IOException {

@Test
public void createBinaryDatabaseConnectCsv() throws IOException {

ORecordSerializer prev = ODatabaseDocumentTx.getDefaultSerializer();
ODatabaseDocumentTx.setDefaultSerializer(ORecordSerializerBinary.INSTANCE);
createDatabase();

Expand All @@ -93,6 +95,7 @@ public void createBinaryDatabaseConnectCsv() throws IOException {
dbTx.close();

dropDatabase();
ODatabaseDocumentTx.setDefaultSerializer(prev);
}
}

Expand Down

0 comments on commit 2f3aa1f

Please sign in to comment.