Fix bug vertices has joint primary keys load error

Fix #17

Change-Id: I74ff2445602ff8afb76b58c3e9da5ea68eebeb27
diff --git a/pom.xml b/pom.xml
index b9cfa06..a9fc466 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>com.baidu.hugegraph</groupId>
     <artifactId>hugegraph-loader</artifactId>
-    <version>0.7.0</version>
+    <version>0.8.0</version>
 
     <properties>
         <release.name>hugegraph-loader</release.name>
diff --git a/src/main/java/com/baidu/hugegraph/loader/parser/EdgeParser.java b/src/main/java/com/baidu/hugegraph/loader/parser/EdgeParser.java
index f83965d..67220c5 100644
--- a/src/main/java/com/baidu/hugegraph/loader/parser/EdgeParser.java
+++ b/src/main/java/com/baidu/hugegraph/loader/parser/EdgeParser.java
@@ -19,7 +19,6 @@
 
 package com.baidu.hugegraph.loader.parser;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -82,7 +81,7 @@
                                  List<String> fieldNames,
                                  Map<String, Object> keyValues) {
         List<String> primaryKeys = vertexLabel.primaryKeys();
-        List<Object> primaryValues = new ArrayList<>(primaryKeys.size());
+        Object[] primaryValues = new Object[primaryKeys.size()];
         for (String fieldName : fieldNames) {
             if (!keyValues.containsKey(fieldName)) {
                 continue;
@@ -110,7 +109,7 @@
                 // The id strategy of source/target label must be PRIMARY_KEY
                 if (primaryKeys.contains(key)) {
                     int index = primaryKeys.indexOf(key);
-                    primaryValues.add(index, value);
+                    primaryValues[index] = value;
                 }
             }
         }
diff --git a/src/main/java/com/baidu/hugegraph/loader/parser/ElementParser.java b/src/main/java/com/baidu/hugegraph/loader/parser/ElementParser.java
index a39ea5e..b28b52e 100644
--- a/src/main/java/com/baidu/hugegraph/loader/parser/ElementParser.java
+++ b/src/main/java/com/baidu/hugegraph/loader/parser/ElementParser.java
@@ -151,8 +151,8 @@
     }
 
     protected String spliceVertexId(VertexLabel vertexLabel,
-                                    List<Object> primaryValues) {
-        E.checkArgument(vertexLabel.primaryKeys().size() == primaryValues.size(),
+                                    Object[] primaryValues) {
+        E.checkArgument(vertexLabel.primaryKeys().size() == primaryValues.length,
                         "Missing some primary key columns, expect %s, " +
                         "but only got %s for vertex label '%s'",
                         vertexLabel.primaryKeys(), primaryValues, vertexLabel);
diff --git a/src/main/java/com/baidu/hugegraph/loader/parser/VertexParser.java b/src/main/java/com/baidu/hugegraph/loader/parser/VertexParser.java
index bd2fbc8..ba6127e 100644
--- a/src/main/java/com/baidu/hugegraph/loader/parser/VertexParser.java
+++ b/src/main/java/com/baidu/hugegraph/loader/parser/VertexParser.java
@@ -19,7 +19,6 @@
 
 package com.baidu.hugegraph.loader.parser;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -85,7 +84,7 @@
         } else {
             assert isPrimaryKey(this.vertexLabel.idStrategy());
             List<String> primaryKeys = this.vertexLabel.primaryKeys();
-            List<Object> primaryValues = new ArrayList<>(primaryKeys.size());
+            Object[] primaryValues = new Object[primaryKeys.size()];
             for (Map.Entry<String, Object> entry : keyValues.entrySet()) {
                 String fieldName = entry.getKey();
                 Object fieldValue = entry.getValue();
@@ -95,7 +94,7 @@
 
                 if (primaryKeys.contains(key)) {
                     int index = primaryKeys.indexOf(key);
-                    primaryValues.add(index, value);
+                    primaryValues[index] = value;
                 }
             }
             String id = this.spliceVertexId(this.vertexLabel, primaryValues);
diff --git a/src/test/java/com/baidu/hugegraph/loader/test/functional/LoaderTest.java b/src/test/java/com/baidu/hugegraph/loader/test/functional/LoaderTest.java
index e7a42bd..be0abbf 100644
--- a/src/test/java/com/baidu/hugegraph/loader/test/functional/LoaderTest.java
+++ b/src/test/java/com/baidu/hugegraph/loader/test/functional/LoaderTest.java
@@ -509,6 +509,33 @@
         FileUtil.delete(path("vertex_person_number_id.csv"));
     }
 
+    @Test
+    public void testLoadVerticesWithJointPrimaryKeys() {
+        String line = FileUtil.newCSVLine("marko", 29, "Beijing");
+        FileUtil.append(path("vertex_person.csv"), line);
+
+        String[] args = new String[]{"-f", path("struct_joint_pk.json"),
+                                     "-s", path("schema_joint_pk.groovy"),
+                                     "-g", "hugegraph",
+                                     "--test-mode", "true"};
+        try {
+            HugeGraphLoader.main(args);
+        } catch (Exception e) {
+            Assert.fail("Should not throw exception, but throw " + e);
+        }
+
+        List<Vertex> vertices = client.graph().listVertices();
+
+        Assert.assertEquals(1, vertices.size());
+        Vertex vertex = vertices.get(0);
+
+        Assert.assertTrue(vertex.id().toString().contains("marko!Beijing"));
+        Assert.assertEquals("person", vertex.label());
+        Assert.assertEquals("marko", vertex.property("name"));
+        Assert.assertEquals(29, vertex.property("age"));
+        Assert.assertEquals("Beijing", vertex.property("city"));
+    }
+
     private static String path(String fileName) {
         return Paths.get(PATH_PREFIX, fileName).toString();
     }
diff --git a/src/test/resources/schema_joint_pk.groovy b/src/test/resources/schema_joint_pk.groovy
new file mode 100644
index 0000000..5e0616e
--- /dev/null
+++ b/src/test/resources/schema_joint_pk.groovy
@@ -0,0 +1,10 @@
+// Define schema
+schema.propertyKey("name").asText().ifNotExist().create();
+schema.propertyKey("age").asInt().ifNotExist().create();
+schema.propertyKey("city").asText().ifNotExist().create();
+schema.propertyKey("weight").asDouble().ifNotExist().create();
+schema.propertyKey("date").asText().ifNotExist().create();
+
+schema.vertexLabel("person").properties("name", "age", "city").primaryKeys("name", "city").ifNotExist().create();
+
+schema.edgeLabel("knows").sourceLabel("person").targetLabel("person").properties("date", "weight").ifNotExist().create();
diff --git a/src/test/resources/struct_joint_pk.json b/src/test/resources/struct_joint_pk.json
new file mode 100644
index 0000000..7bb6826
--- /dev/null
+++ b/src/test/resources/struct_joint_pk.json
@@ -0,0 +1,18 @@
+{
+  "vertices": [
+    {
+      "label": "person",
+      "input": {
+        "type": "file",
+        "path": "src/test/resources/vertex_person.csv",
+        "format": "CSV",
+        "charset": "UTF-8"
+      },
+      "mapping": {
+        "name": "name",
+        "age": "age",
+        "city": "city"
+      }
+    }
+  ]
+}