package com.orientechnologies.orient.etl.transformer;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.etl.OETLBaseTest;
import com.tinkerpop.blueprints.Parameter;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
import org.junit.Before;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Created by frank on 23/11/2015.
*/
public class OMergeTransformerTest extends OETLBaseTest {
@Before
public void loadData() {
graph.createVertexType("Person");
graph.createKeyIndex("num", Vertex.class, new Parameter<String, String>("type", "UNIQUE"),
new Parameter<String, String>("class", "Person"));
graph.commit();
}
@Test
public void shouldUpdateExistingVertices() throws Exception {
//prepare graph
graph.addVertex("class:Person", "num", 10000, "name", "FirstName");
graph.commit();
assertThat(graph.countVertices("Person")).isEqualTo(1);
Iterable<Vertex> vertices = graph.getVertices("Person.num", 10000);
assertThat(vertices).hasSize(1);
final Vertex inserted = vertices.iterator().next();
assertThat(inserted.getProperty("name")).isEqualTo("FirstName");
assertThat(inserted.getProperty("num")).isEqualTo(10000);
//update graph with CSV: avoid num to be casted to integer forcing string
process(" {source: { content: { value: 'num,name\n10000,FirstNameUpdated' } }, "
+ "extractor : { csv: {} }," + " transformers: ["
+ "{merge: { joinFieldName:'num', lookup:'Person.num'}}, "
+ "{vertex: { class:'Person', skipDuplicates: false}}"
+ "],"
+ "loader: { orientdb: { dbURL: 'memory:OETLBaseTest', dbType:'graph', tx: true} } }");
//verify
graph = new OrientGraph("memory:OETLBaseTest");
assertThat(graph.countVertices("Person")).isEqualTo(1);
vertices = graph.getVertices("Person.num", 10000);
assertThat(vertices).hasSize(1);
final Vertex updated = vertices.iterator().next();
ORecord load = graph.getRawGraph().load((ORID) updated.getId());
assertThat(updated.getProperty("name")).isEqualTo("FirstNameUpdated");
assertThat(updated.getProperty("num")).isEqualTo(10000);
}
@Test
public void shouldMergeVertexOnDuplitcatedInputSet() throws Exception {
//CSV contains duplicated data
process(
"{source: { content: { value: 'num,name\n10000,FirstName\n10001,SecondName\n10000,FirstNameUpdated' } }, extractor : { csv: {} },"
+ " transformers: [{merge: { joinFieldName:'num', lookup:'Person.num'}}, {vertex: {class:'Person', skipDuplicates: true}}],"
+ " " + "loader: { orientdb: { dbURL: 'memory:OETLBaseTest', dbType:'graph', useLightweightEdges:false } } }");
assertThat(graph.countVertices("Person")).isEqualTo(2);
final Iterable<Vertex> vertices = graph.getVertices("Person.num", "10000");
assertThat(vertices).hasSize(1);
final Vertex updated = vertices.iterator().next();
assertThat(updated.getProperty("name")).isEqualTo("FirstNameUpdated");
}
}