package com.orientechnologies.orient.core.db.record; import com.orientechnologies.orient.core.db.document.ODatabaseDocument; import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; import com.orientechnologies.orient.core.id.ORID; import com.orientechnologies.orient.core.record.impl.ODocument; import com.orientechnologies.orient.core.record.impl.ONestedMultiValueChangeEvent; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * Created by tglman on 11/03/16. */ public class ODocumentTrackingNestedCollectionsTest { private ODatabaseDocument db; @Before public void before() { db = new ODatabaseDocumentTx("memory:" + ODocumentTrackingNestedCollectionsTest.class.getSimpleName()); db.create(); } @After public void after() { db.drop(); } @Test public void testTrackingNestedSet() { ORID orid; ODocument document = new ODocument(); Set objects = new HashSet(); document.field("objects", objects); document.save(); objects = document.field("objects"); Set subObjects = new HashSet(); objects.add(subObjects); document.save(); orid = document.getIdentity(); objects = document.field("objects"); subObjects = (Set) objects.iterator().next(); ODocument nestedDoc = new ODocument(); subObjects.add(nestedDoc); document.save(); db.getLocalCache().clear(); document = db.load(orid); objects = document.field("objects"); subObjects = (Set) objects.iterator().next(); assertTrue(!subObjects.isEmpty()); } @Test public void testChangesValuesNestedTrackingSet() { ODocument document = new ODocument(); Set objects = new HashSet(); document.field("objects", objects); Set subObjects = new HashSet(); objects.add(subObjects); ODocument nestedDoc = new ODocument(); subObjects.add(nestedDoc); document.save(); objects = document.field("objects"); subObjects = (Set) objects.iterator().next(); subObjects.add("one"); OMultiValueChangeTimeLine<Object, Object> timeLine = document.getCollectionTimeLine("objects"); assertEquals(1, timeLine.getMultiValueChangeEvents().size()); assertTrue(timeLine.getMultiValueChangeEvents().get(0) instanceof ONestedMultiValueChangeEvent); ONestedMultiValueChangeEvent nesetedEvent = (ONestedMultiValueChangeEvent) timeLine.getMultiValueChangeEvents().get(0); assertEquals(1, nesetedEvent.getTimeLine().getMultiValueChangeEvents().size()); List<OMultiValueChangeEvent<?, ?>> multiValueChangeEvents = nesetedEvent.getTimeLine().getMultiValueChangeEvents(); assertEquals("one", multiValueChangeEvents.get(0).getValue()); } @Test public void testChangesValuesNestedTrackingList() { ODocument document = new ODocument(); List objects = new ArrayList(); document.field("objects", objects); List subObjects = new ArrayList(); objects.add(subObjects); ODocument nestedDoc = new ODocument(); subObjects.add(nestedDoc); document.save(); objects = document.field("objects"); subObjects = (List) objects.iterator().next(); subObjects.add("one"); subObjects.add(new ODocument()); OMultiValueChangeTimeLine<Object, Object> timeLine = document.getCollectionTimeLine("objects"); assertEquals(1, timeLine.getMultiValueChangeEvents().size()); assertTrue(timeLine.getMultiValueChangeEvents().get(0) instanceof ONestedMultiValueChangeEvent); ONestedMultiValueChangeEvent nesetedEvent = (ONestedMultiValueChangeEvent) timeLine.getMultiValueChangeEvents().get(0); assertEquals(2, nesetedEvent.getTimeLine().getMultiValueChangeEvents().size()); List<OMultiValueChangeEvent<?, ?>> multiValueChangeEvents = nesetedEvent.getTimeLine().getMultiValueChangeEvents(); assertEquals(1, multiValueChangeEvents.get(0).getKey()); assertEquals("one", multiValueChangeEvents.get(0).getValue()); assertEquals(2, multiValueChangeEvents.get(1).getKey()); assertTrue(multiValueChangeEvents.get(1).getValue() instanceof ODocument); } @Test public void testChangesValuesNestedTrackingMap() { ODocument document = new ODocument(); Map objects = new HashMap(); document.field("objects", objects); Map subObjects = new HashMap(); objects.put("first", subObjects); ODocument nestedDoc = new ODocument(); subObjects.put("one", nestedDoc); document.save(); objects = document.field("objects"); subObjects = (Map) objects.values().iterator().next(); subObjects.put("one", "String"); subObjects.put("two", new ODocument()); OMultiValueChangeTimeLine<Object, Object> timeLine = document.getCollectionTimeLine("objects"); assertEquals(1, timeLine.getMultiValueChangeEvents().size()); assertTrue(timeLine.getMultiValueChangeEvents().get(0) instanceof ONestedMultiValueChangeEvent); ONestedMultiValueChangeEvent nesetedEvent = (ONestedMultiValueChangeEvent) timeLine.getMultiValueChangeEvents().get(0); assertEquals(2, nesetedEvent.getTimeLine().getMultiValueChangeEvents().size()); List<OMultiValueChangeEvent<?, ?>> multiValueChangeEvents = nesetedEvent.getTimeLine().getMultiValueChangeEvents(); assertEquals("one", multiValueChangeEvents.get(0).getKey()); assertEquals("String", multiValueChangeEvents.get(0).getValue()); assertEquals("two", multiValueChangeEvents.get(1).getKey()); assertTrue(multiValueChangeEvents.get(1).getValue() instanceof ODocument); } }