diff --git a/fizz-core/src/main/java/we/fizz/function/ListFunc.java b/fizz-core/src/main/java/we/fizz/function/ListFunc.java index d1d0f0b..3f24307 100644 --- a/fizz-core/src/main/java/we/fizz/function/ListFunc.java +++ b/fizz-core/src/main/java/we/fizz/function/ListFunc.java @@ -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> rename(List> data, String... fieldPairs) { + if (data == null || data.size() == 0) { + return data; + } + if (fieldPairs == null || fieldPairs.length == 0) { + return data; + } + + for (Map 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> removeFields(List> data, String... fields) { + if (data == null || data.size() == 0) { + return data; + } + if (fields == null || fields.length == 0) { + return data; + } + for (Map m : data) { + for (String field : fields) { + m.remove(field); + } + } + return data; + } + } diff --git a/fizz-core/src/test/java/we/fizz/function/ListFuncTests.java b/fizz-core/src/test/java/we/fizz/function/ListFuncTests.java index 1e898c1..b028abc 100644 --- a/fizz-core/src/test/java/we/fizz/function/ListFuncTests.java +++ b/fizz-core/src/test/java/we/fizz/function/ListFuncTests.java @@ -244,4 +244,71 @@ class ListFuncTests { assertEquals("Name1", ((Map) result2.get(0)).get("orgName").toString()); } + @Test + void testRename() { + List subList1 = new ArrayList<>(); + subList1.add(createRecord2(1)); + subList1.add(createRecord2(2)); + subList1.add(createRecord2(3)); + subList1.add(createRecord2(4)); + subList1.add(createRecord2(5)); + + List subList2 = new ArrayList<>(); + subList2.add(createRecord2(1)); + Map m2 = createRecord2(2); + m2.put("b", "b22222"); + subList2.add(m2); + subList2.add(createRecord2(3)); + Map 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 result = (List) FuncExecutor.getInstance().exec(ctxNode, funcExpression); + System.out.println(JSON.toJSONString(result)); + assertEquals(5, result.size()); + assertEquals("b2", ((Map) result.get(1)).get("birthday").toString()); + assertEquals("e4", ((Map) result.get(3)).get("email").toString()); + assertEquals(null, ((Map) result.get(3)).get("b")); + assertEquals(null, ((Map) 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 result2 = (List) FuncExecutor.getInstance().exec(ctxNode, funcExpression2); + System.out.println(JSON.toJSONString(result2)); + assertEquals(5, result2.size()); + assertEquals("b2", ((Map) result2.get(1)).get("b").toString()); + assertEquals("e4", ((Map) result2.get(3)).get("e").toString()); + assertEquals("b22222", ((Map) result2.get(1)).get("birthday").toString()); + assertEquals("e44444", ((Map) result2.get(3)).get("email").toString()); + } + + @Test + void testRemoveFields() { + List 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 result = (List) FuncExecutor.getInstance().exec(ctxNode, funcExpression); + System.out.println(JSON.toJSONString(result)); + assertEquals(5, result.size()); + assertEquals(null, ((Map) result.get(1)).get("b")); + assertEquals(null, ((Map) result.get(1)).get("e")); + assertEquals(null, ((Map) result.get(3)).get("b")); + assertEquals(null, ((Map) result.get(3)).get("e")); + + } + } \ No newline at end of file