Add rename and removeFields functions for list #373

This commit is contained in:
Francis Dong
2021-11-11 11:57:39 +08:00
committed by dxfeng10
parent b7e98ca6e3
commit 4a88063416
2 changed files with 122 additions and 0 deletions

View File

@@ -60,6 +60,8 @@ public class ListFunc implements IFunc {
FuncExecutor.register(NAME_SPACE_PREFIX + "list.merge", this);
FuncExecutor.register(NAME_SPACE_PREFIX + "list.extract", this);
FuncExecutor.register(NAME_SPACE_PREFIX + "list.join", this);
FuncExecutor.register(NAME_SPACE_PREFIX + "list.rename", this);
FuncExecutor.register(NAME_SPACE_PREFIX + "list.removeFields", this);
}
/**
@@ -171,4 +173,57 @@ public class ListFunc implements IFunc {
return dest;
}
/**
* Rename fields of list
*
* @param data list
* @param fieldPairs old and new key pair of map of list, pattern:
* oldFieldName:newFieldName
* @return
*/
public List<Map<String, Object>> rename(List<Map<String, Object>> data, String... fieldPairs) {
if (data == null || data.size() == 0) {
return data;
}
if (fieldPairs == null || fieldPairs.length == 0) {
return data;
}
for (Map<String, Object> m : data) {
for (String fieldPair : fieldPairs) {
String[] parts = fieldPair.split(":");
if (parts == null || parts.length != 2) {
LOGGER.warn("invalid fieldPair: {} , field pair pattern is: oldFieldName:newFieldName", fieldPair);
throw new FizzRuntimeException(
"invalid fieldPair: " + fieldPair + " , field pair pattern is: oldFieldName:newFieldName");
}
m.put(parts[1], m.get(parts[0]));
m.remove(parts[0]);
}
}
return data;
}
/**
* Remove fields from list
*
* @param data
* @param fields fields to be removed
* @return
*/
public List<Map<String, Object>> removeFields(List<Map<String, Object>> data, String... fields) {
if (data == null || data.size() == 0) {
return data;
}
if (fields == null || fields.length == 0) {
return data;
}
for (Map<String, Object> m : data) {
for (String field : fields) {
m.remove(field);
}
}
return data;
}
}

View File

@@ -244,4 +244,71 @@ class ListFuncTests {
assertEquals("Name1", ((Map<String, Object>) result2.get(0)).get("orgName").toString());
}
@Test
void testRename() {
List<Object> subList1 = new ArrayList<>();
subList1.add(createRecord2(1));
subList1.add(createRecord2(2));
subList1.add(createRecord2(3));
subList1.add(createRecord2(4));
subList1.add(createRecord2(5));
List<Object> subList2 = new ArrayList<>();
subList2.add(createRecord2(1));
Map<String, Object> m2 = createRecord2(2);
m2.put("b", "b22222");
subList2.add(m2);
subList2.add(createRecord2(3));
Map<String, Object> m4 = createRecord2(4);
m4.put("e", "e44444");
subList2.add(m4);
subList2.add(createRecord2(5));
ONode ctxNode = ONode.load(new HashMap());
PathMapping.setByPath(ctxNode, "test.data", subList1, true);
PathMapping.setByPath(ctxNode, "test.data2", subList2, true);
String funcExpression = "fn.list.rename({test.data}, \"b:birthday\", \"e:email\")";
List<Object> result = (List<Object>) FuncExecutor.getInstance().exec(ctxNode, funcExpression);
System.out.println(JSON.toJSONString(result));
assertEquals(5, result.size());
assertEquals("b2", ((Map<String, Object>) result.get(1)).get("birthday").toString());
assertEquals("e4", ((Map<String, Object>) result.get(3)).get("email").toString());
assertEquals(null, ((Map<String, Object>) result.get(3)).get("b"));
assertEquals(null, ((Map<String, Object>) result.get(3)).get("e"));
String funcExpression2 = "fn.list.join({test.data}, fn.list.rename({test.data2}, \"b:birthday\", \"e:email\"), \"a\", \"birthday\", \"email\")";
List<Object> result2 = (List<Object>) FuncExecutor.getInstance().exec(ctxNode, funcExpression2);
System.out.println(JSON.toJSONString(result2));
assertEquals(5, result2.size());
assertEquals("b2", ((Map<String, Object>) result2.get(1)).get("b").toString());
assertEquals("e4", ((Map<String, Object>) result2.get(3)).get("e").toString());
assertEquals("b22222", ((Map<String, Object>) result2.get(1)).get("birthday").toString());
assertEquals("e44444", ((Map<String, Object>) result2.get(3)).get("email").toString());
}
@Test
void testRemoveFields() {
List<Object> subList1 = new ArrayList<>();
subList1.add(createRecord2(1));
subList1.add(createRecord2(2));
subList1.add(createRecord2(3));
subList1.add(createRecord2(4));
subList1.add(createRecord2(5));
ONode ctxNode = ONode.load(new HashMap());
PathMapping.setByPath(ctxNode, "test.data", subList1, true);
String funcExpression = "fn.list.removeFields({test.data}, \"b\", \"e\")";
List<Object> result = (List<Object>) FuncExecutor.getInstance().exec(ctxNode, funcExpression);
System.out.println(JSON.toJSONString(result));
assertEquals(5, result.size());
assertEquals(null, ((Map<String, Object>) result.get(1)).get("b"));
assertEquals(null, ((Map<String, Object>) result.get(1)).get("e"));
assertEquals(null, ((Map<String, Object>) result.get(3)).get("b"));
assertEquals(null, ((Map<String, Object>) result.get(3)).get("e"));
}
}