package com.orientechnologies.orient.core.index; import com.orientechnologies.orient.core.db.record.OMultiValueChangeEvent; import com.orientechnologies.orient.core.metadata.schema.OType; import com.orientechnologies.orient.core.record.impl.ODocument; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.*; /** * @author LomakiA <a href="mailto:a.lomakin@orientechnologies.com">Andrey Lomakin</a> * @since 20.12.11 */ @Test public class OPropertyListIndexDefinitionTest { private OPropertyListIndexDefinition propertyIndex; @BeforeMethod public void beforeMethod() { propertyIndex = new OPropertyListIndexDefinition("testClass", "fOne", OType.INTEGER); } public void testCreateValueSingleParameter() { final Object result = propertyIndex.createValue(Collections.singletonList(Arrays.asList("12", "23"))); Assert.assertTrue(result instanceof Collection); final Collection<?> collectionResult = (Collection<?>) result; Assert.assertEquals(collectionResult.size(), 2); Assert.assertTrue(collectionResult.contains(12)); Assert.assertTrue(collectionResult.contains(23)); } public void testCreateValueTwoParameters() { final Object result = propertyIndex.createValue(Arrays.asList(Arrays.asList("12", "23"), "25")); Assert.assertTrue(result instanceof Collection); final Collection<?> collectionResult = (Collection<?>) result; Assert.assertEquals(collectionResult.size(), 2); Assert.assertTrue(collectionResult.contains(12)); Assert.assertTrue(collectionResult.contains(23)); } public void testCreateValueWrongParameter() { try { propertyIndex.createValue(Collections.singletonList("tt")); Assert.fail(); } catch (OIndexException x) { } } public void testCreateValueSingleParameterArrayParams() { final Object result = propertyIndex.createValue((Object) Arrays.asList("12", "23")); Assert.assertTrue(result instanceof Collection); final Collection<?> collectionResult = (Collection<?>) result; Assert.assertEquals(collectionResult.size(), 2); Assert.assertTrue(collectionResult.contains(12)); Assert.assertTrue(collectionResult.contains(23)); } public void testCreateValueTwoParametersArrayParams() { final Object result = propertyIndex.createValue(Arrays.asList("12", "23"), "25"); Assert.assertTrue(result instanceof Collection); final Collection<?> collectionResult = (Collection<?>) result; Assert.assertEquals(collectionResult.size(), 2); Assert.assertTrue(collectionResult.contains(12)); Assert.assertTrue(collectionResult.contains(23)); } public void testCreateValueWrongParameterArrayParams() { Assert.assertNull(propertyIndex.createValue("tt")); } public void testGetDocumentValueToIndex() { final ODocument document = new ODocument(); document.field("fOne", Arrays.asList("12", "23")); document.field("fTwo", 10); final Object result = propertyIndex.getDocumentValueToIndex(document); Assert.assertTrue(result instanceof Collection); final Collection<?> collectionResult = (Collection<?>) result; Assert.assertEquals(collectionResult.size(), 2); Assert.assertTrue(collectionResult.contains(12)); Assert.assertTrue(collectionResult.contains(23)); } public void testCreateSingleValue() { final Object result = propertyIndex.createSingleValue("12"); Assert.assertEquals(result, 12); } @Test(expectedExceptions = OIndexException.class) public void testCreateSingleValueWrongParameter() { propertyIndex.createSingleValue("tt"); } public void testProcessChangeEventAddOnce() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEvent = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); propertyIndex.processChangeEvent(multiValueChangeEvent, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddOnceWithConversion() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, String> multiValueChangeEvent = new OMultiValueChangeEvent<Integer, String>( OMultiValueChangeEvent.OChangeType.ADD, 0, "42"); propertyIndex.processChangeEvent(multiValueChangeEvent, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddTwoTimes() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 1, 42); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 2); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddTwoValues() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 1, 43); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 1); addedKeys.put(43, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventRemoveOnce() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEvent = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); propertyIndex.processChangeEvent(multiValueChangeEvent, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventRemoveOnceWithConversion() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, String> multiValueChangeEvent = new OMultiValueChangeEvent<Integer, String>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, "42"); propertyIndex.processChangeEvent(multiValueChangeEvent, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventRemoveTwoTimes() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 1, null, 42); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 2); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddTwoTimesInvValue() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 1, 555); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 1); addedKeys.put(555, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddRemove() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddRemoveInvValue() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 55); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(55, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddTwiceRemoveOnce() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 1, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventThree = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventThree, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(42, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventAddOnceRemoveTwice() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 0, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventThree = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventThree, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventRemoveTwoTimesAddOnce() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventOne = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 0, null, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventTwo = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.REMOVE, 1, null, 42); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEventThree = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.ADD, 1, 42); propertyIndex.processChangeEvent(multiValueChangeEventOne, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventTwo, keysToAdd, keysToRemove); propertyIndex.processChangeEvent(multiValueChangeEventThree, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventUpdate() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, Integer> multiValueChangeEvent = new OMultiValueChangeEvent<Integer, Integer>( OMultiValueChangeEvent.OChangeType.UPDATE, 0, 41, 42); propertyIndex.processChangeEvent(multiValueChangeEvent, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(41, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } public void testProcessChangeEventUpdateConvertValues() { final Map<Object, Integer> keysToAdd = new HashMap<Object, Integer>(); final Map<Object, Integer> keysToRemove = new HashMap<Object, Integer>(); final OMultiValueChangeEvent<Integer, String> multiValueChangeEvent = new OMultiValueChangeEvent<Integer, String>( OMultiValueChangeEvent.OChangeType.UPDATE, 0, "41", "42"); propertyIndex.processChangeEvent(multiValueChangeEvent, keysToAdd, keysToRemove); final Map<Object, Integer> addedKeys = new HashMap<Object, Integer>(); addedKeys.put(41, 1); final Map<Object, Integer> removedKeys = new HashMap<Object, Integer>(); removedKeys.put(42, 1); Assert.assertEquals(keysToAdd, addedKeys); Assert.assertEquals(keysToRemove, removedKeys); } }