/******************************************************************************* * Copyright (c) 2014 EURA NOVA. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Aldemar Reynaga - initial API and implementation * Salim Jouili - initial API and implementation ******************************************************************************/ package com.imgraph.tests; import static org.junit.Assert.*; import java.util.HashSet; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.steffi.index.ImgIndex; import com.steffi.index.ImgIndexHits; import com.steffi.model.Cell; import com.steffi.model.EdgeType; import com.steffi.model.SteffiEdge; import com.steffi.model.SteffiGraph; import com.steffi.model.SteffiVertex; /** * @author Aldemar Reynaga * Set of tests for index functionalities */ public class TestIndexes extends BaseLocalTest { @Override @Before public void graphSetup() { super.graphSetup(); graph.createVertexIndex("vIndex"); graph.createEdgeIndex("eIndex"); } @Override @After public void graphTearDown() { super.graphTearDown(); graph.removeIndex("vIndex"); graph.removeIndex("eIndex"); } @Test public void testIndexCreation() { assertNotNull(graph.getIndex("vIndex", SteffiVertex.class)); assertNotNull(graph.getIndex("eIndex", SteffiEdge.class)); } private <T extends Cell> void indexProperties(T cell, ImgIndex<T> index) { for (String key : cell.getAttributeKeys()) index.put(key, cell.getAttribute(key), cell); } private void putKeyValues() { ImgIndex<SteffiVertex> vertexIndex = graph.getIndex("vIndex", SteffiVertex.class); ImgIndex<SteffiEdge> edgeIndex = graph.getIndex("eIndex", SteffiEdge.class); graph.startTransaction(); SteffiVertex v100 = graph.getVertex(100); SteffiVertex v101 = graph.getVertex(101); SteffiVertex v1 = graph.addVertex(1L, null); v1.putAttribute("name", "Paul"); v1.putAttribute("weight", 50); indexProperties(v100, vertexIndex); indexProperties(v101, vertexIndex); indexProperties(v1, vertexIndex); for (SteffiEdge edge : v100.getEdges()) indexProperties(edge, edgeIndex); for (SteffiEdge edge : v101.getEdges()) indexProperties(edge, edgeIndex); graph.commit(); } @Test public void testIndexRollback() { putKeyValues(); ImgIndex<SteffiVertex> vertexIndex = graph.getIndex("vIndex", SteffiVertex.class); ImgIndex<SteffiEdge> edgeIndex = graph.getIndex("eIndex", SteffiEdge.class); graph.startTransaction(); SteffiVertex v103 = graph.getVertex(103); SteffiVertex v104 = graph.getVertex(104); indexProperties(v103, vertexIndex); indexProperties(v104, vertexIndex); indexProperties(v103.getEdge(100, EdgeType.IN, "recommends"), edgeIndex); indexProperties(v104.getEdge(101, EdgeType.OUT, "recommends"), edgeIndex); indexProperties(v104.getEdge(100, EdgeType.IN, "recommends"), edgeIndex); graph.rollback(); ImgIndexHits<SteffiVertex> vertexHits = vertexIndex.get("name", "Jane"); assertFalse(vertexHits.hasNext()); vertexHits = vertexIndex.get("weight", 49); assertFalse(vertexHits.hasNext()); vertexHits = vertexIndex.get("name", "Amy"); assertFalse(vertexHits.hasNext()); vertexHits = vertexIndex.get("wwight", 98); assertFalse(vertexHits.hasNext()); ImgIndexHits<SteffiEdge> edgeHits = edgeIndex.get("stars", 3); int counter=0; for (SteffiEdge edge: edgeHits) { assertTrue(isEdgeWith(edge, EdgeType.OUT, "recommends", 103, 100) || isEdgeWith(edge, EdgeType.OUT, "recommends", 102, 101)); counter++; } assertEquals(2, counter); edgeHits = edgeIndex.get("stars", 5); assertTrue(isEdgeWith(edgeHits.next(), EdgeType.OUT, "recommends", 104, 100)); assertFalse(edgeHits.hasNext()); } @Test public void testRemoveKeyValue() { putKeyValues(); ImgIndex<SteffiVertex> vertexIndex = graph.getIndex("vIndex", SteffiVertex.class); ImgIndex<SteffiEdge> edgeIndex = graph.getIndex("eIndex", SteffiEdge.class); graph.startTransaction(); SteffiVertex v100 = graph.getVertex(100); SteffiVertex v101 = graph.getVertex(101); vertexIndex.remove(v100, "name", "John"); vertexIndex.remove(v101, "weight", 50); edgeIndex.remove(v100.getEdge(103, EdgeType.OUT, "recommends"), "stars", 3); edgeIndex.remove(v101.getEdge(102, EdgeType.OUT, "recommends"), "stars", 3); graph.commit(); vertexIndex = graph.getIndex("vIndex", SteffiVertex.class); edgeIndex = graph.getIndex("eIndex", SteffiEdge.class); ImgIndexHits<SteffiVertex> vertexHits = vertexIndex.get("name", "John"); assertFalse(vertexHits.hasNext()); vertexHits = vertexIndex.get("weight", 50); assertEquals(1, vertexHits.next().getId()); assertFalse(vertexHits.hasNext()); ImgIndexHits<SteffiEdge> edgeHits= edgeIndex.get("stars", 3); assertFalse(edgeHits.hasNext()); } @Test public void testPutKeyValue() { putKeyValues(); ImgIndex<SteffiVertex> vertexIndex = graph.getIndex("vIndex", SteffiVertex.class); ImgIndex<SteffiEdge> edgeIndex = graph.getIndex("eIndex", SteffiEdge.class); ImgIndexHits<SteffiVertex> indexHits = vertexIndex.get("name", "John"); assertEquals(100, indexHits.next().getId()); assertFalse(indexHits.hasNext()); indexHits = vertexIndex.get("name", "Mary"); assertEquals(101, indexHits.next().getId()); assertFalse(indexHits.hasNext()); indexHits = vertexIndex.get("name", "Paul"); assertEquals(1, indexHits.next().getId()); assertFalse(indexHits.hasNext()); indexHits = vertexIndex.get("weight", 68); assertEquals(100, indexHits.next().getId()); assertFalse(indexHits.hasNext()); Set<Long> vertexIds = new HashSet<Long>(); indexHits = vertexIndex.get("weight", 50); for (SteffiVertex vertex : indexHits) vertexIds.add(vertex.getId()); assertTrue(vertexIds.contains(1L)); assertTrue(vertexIds.contains(101L)); assertEquals(2, vertexIds.size()); ImgIndexHits<SteffiEdge> edgeIndexHits = edgeIndex.get("stars", 5); assertTrue(isEdgeWith(edgeIndexHits.next(), EdgeType.OUT, "recommends", 104, 100)); assertFalse(indexHits.hasNext()); edgeIndexHits = edgeIndex.get("stars", 3); int counter=0; for (SteffiEdge edge: edgeIndexHits) { assertTrue(isEdgeWith(edge, EdgeType.OUT, "recommends", 103, 100) || isEdgeWith(edge, EdgeType.OUT, "recommends", 102, 101)); counter++; } assertEquals(2, counter); edgeIndexHits = edgeIndex.get("stars", 5); isEdgeWith(edgeIndexHits.next(), EdgeType.OUT, "recommends", 104, 100); assertFalse(edgeIndexHits.hasNext()); } }