package org.umlg.sqlg.test.edges;

import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
import org.umlg.sqlg.structure.SqlgGraph;
import org.umlg.sqlg.test.BaseTest;

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

/**
 * Date: 2014/10/04
 * Time: 12:33 PM
 */
public class TestEdgeCache extends BaseTest {

    @Test
    public void testEdgeUncommittedProperties() {
        Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
        Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
        Edge e = a1.addEdge("ab", b1, "name", "test");
        this.sqlgGraph.tx().commit();
        e.property("test", "this");
        assertTrue(this.sqlgGraph.traversal().E(e.id()).next().property("name").isPresent());
        assertTrue(this.sqlgGraph.traversal().E(e.id()).next().property("test").isPresent());
        this.sqlgGraph.traversal().E(e.id()).next().property("name1", "test");
        this.sqlgGraph.traversal().E(e.id()).next().property("test1", "test2");
        assertTrue(this.sqlgGraph.traversal().E(e.id()).next().property("name1").isPresent());
        assertTrue(this.sqlgGraph.traversal().E(e.id()).next().property("test1").isPresent());
    }

    @Test
    public void testEdgeCreateEndsUpInVertexEdgeCache() {
        Vertex v1 = this.sqlgGraph.addVertex(T.label, "Person");
        Vertex v2 = this.sqlgGraph.addVertex(T.label, "Person");
        v1.addEdge("friend", v2);
        assertEquals(1, vertexTraversal(this.sqlgGraph, v1).out("friend").count().next().intValue());
        this.sqlgGraph.tx().commit();
    }

    @Test
    public void testMultipleEdgesFromSameVertex() {
        Vertex v1 = this.sqlgGraph.addVertex(T.label, "Person", "name", "mike");
        Vertex v2 = this.sqlgGraph.addVertex(T.label, "Car", "name", "bmw");
        Vertex v3 = this.sqlgGraph.addVertex(T.label, "Car", "name", "bmw");
        Vertex v4 = this.sqlgGraph.addVertex(T.label, "Bike", "name", "ktm");
        v1.addEdge("bts_aaaaaa", v2);
        v1.addEdge("bts_btsalmtos", v4);
        v1.addEdge("bts_btsalm", v3);
        this.sqlgGraph.tx().commit();
        this.sqlgGraph.close();
        try (SqlgGraph sqlgGraph = SqlgGraph.open(configuration)) {
            v1 = sqlgGraph.traversal().V(v1.id()).next();
            assertEquals(1, sqlgGraph.traversal().V(v1.id()).out("bts_btsalm").count().next().intValue());
            assertEquals(1, sqlgGraph.traversal().V(v1.id()).out("bts_btsalmtos").count().next().intValue());
        }
    }
}