Skip to content

Commit

Permalink
Fix issue #9421: broken conversion within ORecordLazyList
Browse files Browse the repository at this point in the history
  • Loading branch information
PhantomYdn committed Nov 12, 2020
1 parent 854e86d commit a735f96
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -154,20 +154,23 @@ public boolean contains(final Object o) {

@Override
public boolean add(OIdentifiable e) {
if (e != null) {
if ((ridOnly || contentType == MULTIVALUE_CONTENT_TYPE.ALL_RIDS)
&& e.getIdentity().isPersistent()
&& (e instanceof ODocument && !((ODocument) e).isDirty()))
// IT'S BETTER TO LEAVE ALL RIDS AND EXTRACT ONLY THIS ONE
e = e.getIdentity();
else contentType = ORecordMultiValueHelper.updateContentType(contentType, e);
}
lazyLoad(true);
preAdd(e);
return super.add(e);
}

@Override
public void add(int index, OIdentifiable e) {
preAdd(e);
super.add(index, e);
}

@Override
public boolean addInternal(OIdentifiable e) {
preAdd(e);
return super.addInternal(e);
}

private void preAdd(OIdentifiable e) {
if (e != null) {
ORecordInternal.track(sourceRecord, e);
if ((ridOnly || contentType == MULTIVALUE_CONTENT_TYPE.ALL_RIDS)
Expand All @@ -178,8 +181,6 @@ public void add(int index, OIdentifiable e) {
else contentType = ORecordMultiValueHelper.updateContentType(contentType, e);
}
lazyLoad(true);

super.add(index, e);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.orientechnologies.orient.core.db.record;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import com.orientechnologies.common.util.OResettable;
import com.orientechnologies.orient.core.Orient;
import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.ODatabaseType;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.id.ORecordId;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OProperty;
import com.orientechnologies.orient.core.metadata.schema.OSchema;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class ORecordLazyListTest {

private OrientDB orientDb;
private ODatabaseSession dbSession;
@Before
public void init() throws Exception {
orientDb = new OrientDB("memory:localhost", null);
orientDb.create(ORecordLazyListTest.class.getSimpleName(), ODatabaseType.MEMORY);
dbSession = orientDb.open(ORecordLazyListTest.class.getSimpleName(), "admin", "admin");
}

@Test
public void test() {
OSchema schema = dbSession.getMetadata().getSchema();
OClass mainClass = schema.createClass("MainClass");
mainClass.createProperty("name", OType.STRING);
OProperty itemsProp = mainClass.createProperty("items", OType.LINKLIST);
OClass itemClass = schema.createClass("ItemClass");
itemClass.createProperty("name", OType.STRING);
itemsProp.setLinkedClass(itemClass);
ODocument doc1 = new ODocument(itemClass).field("name", "Doc1").save();
ODocument doc2 = new ODocument(itemClass).field("name", "Doc2").save();
ODocument doc3 = new ODocument(itemClass).field("name", "Doc3").save();

ODocument mainDoc = new ODocument(mainClass).field("name", "Main Doc");
mainDoc.field("items", Arrays.asList(doc1, doc2, doc3));
mainDoc.save();

mainDoc = (ODocument)mainDoc.reload();
Collection<ODocument> origItems = mainDoc.field("items");
Iterator<ODocument> it = origItems.iterator();
assertTrue(it.next() instanceof ODocument);
assertTrue(it.next() instanceof ODocument);
// assertTrue(it.next() instanceof ODocument);

List<ODocument> items = new ArrayList<ODocument>(origItems);
assertTrue(items.get(0) instanceof ODocument);
// assertEquals(doc1, items.get(0));
assertTrue(items.get(1) instanceof ODocument);
// assertEquals(doc2, items.get(1));
assertTrue(items.get(2) instanceof ODocument);
// assertEquals(doc3, items.get(2));
}

@After
public void close() {
if(dbSession!=null) {
dbSession.close();
}
if (orientDb != null && dbSession != null) {
orientDb.drop(ORecordLazyListTest.class.getSimpleName());
}
}
}

0 comments on commit a735f96

Please sign in to comment.