]> source.dussan.org Git - sonarqube.git/commitdiff
Increased coverage for ListUpdateScripts
authorStephane Gamard <stephane.gamard@searchbox.com>
Thu, 14 Aug 2014 14:39:12 +0000 (16:39 +0200)
committerStephane Gamard <stephane.gamard@searchbox.com>
Thu, 14 Aug 2014 14:39:12 +0000 (16:39 +0200)
server/sonar-search/src/main/java/org/sonar/search/script/ListUpdate.java
server/sonar-search/src/test/java/org/sonar/search/script/UpdateListScriptTest.java

index c17c56b97c95c79050729129195de83513b31b15..46c4ceed487ad3593548c473ec3f3066e86c0f51 100644 (file)
@@ -25,7 +25,9 @@ import org.elasticsearch.script.AbstractExecutableScript;
 import org.elasticsearch.script.ExecutableScript;
 import org.elasticsearch.script.NativeScriptFactory;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 
 public class ListUpdate extends AbstractExecutableScript {
@@ -104,14 +106,19 @@ public class ListUpdate extends AbstractExecutableScript {
 
       if (fieldValue == null && value != null) {
         // 0. The field does not exist (this is a upsert then)
-        source.put(field, value);
+        List values = new ArrayList<Object>(1);
+        values.add(value);
+        source.put(field, values);
       } else if (!XContentMapValues.isArray(fieldValue) && value != null) {
         // 1. The field is not yet a list
         Map currentFieldValue = XContentMapValues.nodeMapValue(fieldValue, "current FieldValue");
         if (XContentMapValues.nodeStringValue(currentFieldValue.get(idField), null).equals(idValue)) {
           source.put(field, value);
         } else {
-          source.put(field, org.elasticsearch.common.collect.ImmutableSet.of(fieldValue, value));
+          List values = new ArrayList<Object>(2);
+          values.add(fieldValue);
+          values.add(value);
+          source.put(field, values);
         }
       } else {
         // 3. field is a list
index 93cf42164399d97a040e645a3067b303745a547e..5b60a9d5eb7af6b1812fd539ec3c33b951b0b35f 100644 (file)
@@ -24,6 +24,7 @@ import org.elasticsearch.script.ExecutableScript;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -98,4 +99,84 @@ public class UpdateListScriptTest {
       assertThat(e.getMessage()).isEqualTo("Missing 'idField' parameter");
     }
   }
+
+
+  @Test
+  public void update_list() throws Exception {
+
+    String listField = "listField";
+    Collection<Map<String, Object>> mapFields;
+    Map source = new HashMap<String, Object>();
+    source.put("field1", "value1");
+
+    // 0 Create list when field does not exists
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put(ListUpdate.FIELD, listField);
+    params.put(ListUpdate.ID_FIELD, "key");
+    params.put(ListUpdate.ID_VALUE, "1");
+    params.put(ListUpdate.VALUE, mapOf("key", "1", "value", "A"));
+
+    ExecutableScript script = factory.newScript(params);
+    script.setNextVar("ctx", ImmutableMap.of("_source",source));
+    script.run();
+
+    mapFields = (Collection)source.get(listField);
+    System.out.println("source = " + source);
+    assertThat(mapFields).hasSize(1);
+
+    // Add item to existing list
+    params = new HashMap<String, Object>();
+    params.put(ListUpdate.FIELD, listField);
+    params.put(ListUpdate.ID_FIELD, "key");
+    params.put(ListUpdate.ID_VALUE, "2");
+    params.put(ListUpdate.VALUE, mapOf("key", "2", "value", "B"));
+    script = factory.newScript(params);
+    script.setNextVar("ctx", ImmutableMap.of("_source",source));
+    script.run();
+    mapFields = (Collection)source.get(listField);
+    assertThat(mapFields).hasSize(2);
+
+    // updated first item in list
+    params = new HashMap<String, Object>();
+    params.put(ListUpdate.FIELD, listField);
+    params.put(ListUpdate.ID_FIELD, "key");
+    params.put(ListUpdate.ID_VALUE, "1");
+    params.put(ListUpdate.VALUE, mapOf("key", "1", "value", "a"));
+    script = factory.newScript(params);
+    script.setNextVar("ctx", ImmutableMap.of("_source",source));
+    script.run();
+    mapFields = (Collection)source.get(listField);
+    assertThat(mapFields).hasSize(2);
+
+    // updated second item in list
+    params = new HashMap<String, Object>();
+    params.put(ListUpdate.FIELD, listField);
+    params.put(ListUpdate.ID_FIELD, "key");
+    params.put(ListUpdate.ID_VALUE, "2");
+    params.put(ListUpdate.VALUE, mapOf("key", "2", "value","b"));
+    script = factory.newScript(params);
+    script.setNextVar("ctx", ImmutableMap.of("_source",source));
+    script.run();
+    mapFields = (Collection)source.get(listField);
+    assertThat(mapFields).hasSize(2);
+
+    // delete first item
+    params = new HashMap<String, Object>();
+    params.put(ListUpdate.FIELD, listField);
+    params.put(ListUpdate.ID_FIELD, "key");
+    params.put(ListUpdate.ID_VALUE, "1");
+    params.put(ListUpdate.VALUE, null);
+    script = factory.newScript(params);
+    script.setNextVar("ctx", ImmutableMap.of("_source",source));
+    script.run();
+    mapFields = (Collection)source.get(listField);
+    assertThat(mapFields).hasSize(1);
+  }
+
+  private Map<String, Object> mapOf(String k, String v, String k1, String v1) {
+    Map<String, Object> map = new HashMap<String, Object>();
+    map.put(k, v);
+    map.put(k1, v1);
+    return map;
+  }
 }
\ No newline at end of file