From 863a9f44d3ef8ede268ae580852f7bcbb5841e0e Mon Sep 17 00:00:00 2001 From: Jens Wille Date: Tue, 11 Jan 2022 22:22:56 +0100 Subject: [PATCH] Refactor field transformation. (#103) --- .../org/metafacture/metafix/FixMethod.java | 113 ++++++++---------- .../java/org/metafacture/metafix/Value.java | 6 +- 2 files changed, 54 insertions(+), 65 deletions(-) diff --git a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java index 33fa6ab0..f2a55d89 100644 --- a/metafix/src/main/java/org/metafacture/metafix/FixMethod.java +++ b/metafix/src/main/java/org/metafacture/metafix/FixMethod.java @@ -29,7 +29,6 @@ import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; -import java.util.function.UnaryOperator; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -194,15 +193,13 @@ public void apply(final Metafix metafix, final Record record, final List }, rename { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> { - final String search = params.get(1); - final String replace = params.get(2); + final String search = params.get(1); + final String replace = params.get(2); - // TODO: recurse into arrays/values - return v.extractType((m, c) -> m - .ifHash(h -> c.accept(Value.newHash(n -> h.forEach((f, w) -> n.put(f.replaceAll(search, replace), w))))) - ); - }); + // TODO: recurse into arrays/values + record.transformField(params.get(0), (m, c) -> m + .ifHash(h -> c.accept(Value.newHash(n -> h.forEach((f, w) -> n.put(f.replaceAll(search, replace), w))))) + ); } }, retain { @@ -268,10 +265,10 @@ public void apply(final Metafix metafix, final Record record, final List }, count { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> v.extractType((m, c) -> m + record.transformField(params.get(0), (m, c) -> m .ifArray(a -> c.accept(new Value(a.size()))) .ifHash(h -> c.accept(new Value(h.size()))) - )); + ); } }, downcase { @@ -281,15 +278,14 @@ public void apply(final Metafix metafix, final Record record, final List }, filter { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> { - final Pattern search = Pattern.compile(params.get(1)); - final boolean invert = getBoolean(options, "invert"); + final Pattern search = Pattern.compile(params.get(1)); + final boolean invert = getBoolean(options, "invert"); - final Predicate predicate = s -> search.matcher(s.asString()).find(); - return v.extractType((m, c) -> m - .ifArray(a -> c.accept(newArray(a.stream().filter(invert ? predicate.negate() : predicate)))) - ); - }); + final Predicate predicate = s -> search.matcher(s.asString()).find(); + + record.transformField(params.get(0), (m, c) -> m + .ifArray(a -> c.accept(newArray(a.stream().filter(invert ? predicate.negate() : predicate)))) + ); } }, index { @@ -300,12 +296,10 @@ public void apply(final Metafix metafix, final Record record, final List }, join_field { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> { - final String joinChar = params.size() > 1 ? params.get(1) : ""; - return v.extractType((m, c) -> m - .ifArray(a -> c.accept(new Value(a.stream().map(Value::toString).collect(Collectors.joining(joinChar))))) - ); - }); + final String joinChar = params.size() > 1 ? params.get(1) : ""; + record.transformField(params.get(0), (m, c) -> m + .ifArray(a -> c.accept(new Value(a.stream().map(Value::toString).collect(Collectors.joining(joinChar))))) + ); } }, lookup { @@ -345,53 +339,48 @@ public void apply(final Metafix metafix, final Record record, final List }, reverse { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> v.extractType((m, c) -> m + record.transformField(params.get(0), (m, c) -> m .ifArray(a -> { - final List list = v.asArray().stream().collect(Collectors.toList()); + final List list = a.stream().collect(Collectors.toList()); Collections.reverse(list); c.accept(new Value(list)); }) - .ifString(s -> c.accept(new Value(new StringBuilder(v.asString()).reverse().toString()))) - )); + .ifString(s -> c.accept(new Value(new StringBuilder(s).reverse().toString()))) + ); } }, sort_field { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> { - final boolean numeric = getBoolean(options, "numeric"); - final boolean reverse = getBoolean(options, "reverse"); - final boolean uniq = getBoolean(options, "uniq"); - - final Function function = Value::asString; - final Comparator comparator = numeric ? - Comparator.comparing(function.andThen(Integer::parseInt)) : Comparator.comparing(function); - - return v.extractType((m, c) -> m - .ifArray(a -> { - final Stream stream = a.stream(); - c.accept(new Value((uniq ? unique(stream) : stream) - .sorted(reverse ? comparator.reversed() : comparator).collect(Collectors.toList())) - ); - }) - ); - }); + final boolean numeric = getBoolean(options, "numeric"); + final boolean reverse = getBoolean(options, "reverse"); + final boolean uniq = getBoolean(options, "uniq"); + + final Function function = Value::asString; + final Comparator comparator = numeric ? + Comparator.comparing(function.andThen(Integer::parseInt)) : Comparator.comparing(function); + + record.transformField(params.get(0), (m, c) -> m + .ifArray(a -> { + final Stream stream = a.stream(); + c.accept(new Value((uniq ? unique(stream) : stream) + .sorted(reverse ? comparator.reversed() : comparator).collect(Collectors.toList()))); + }) + ); } }, split_field { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> { - final String splitChar = params.size() > 1 ? params.get(1) : "\\s+"; - final Pattern splitPattern = Pattern.compile(splitChar); + final String splitChar = params.size() > 1 ? params.get(1) : "\\s+"; + final Pattern splitPattern = Pattern.compile(splitChar); - final UnaryOperator splitOperator = s -> - newArray(Arrays.stream(splitPattern.split(s.asString())).map(Value::new)); + final Function splitOperator = s -> + newArray(Arrays.stream(splitPattern.split(s)).map(Value::new)); - return v.extractType((m, c) -> m - .ifArray(a -> c.accept(newArray(a.stream().map(splitOperator)))) - .ifHash(h -> c.accept(Value.newHash(n -> h.forEach((f, w) -> n.put(f, splitOperator.apply(w)))))) - .ifString(s -> c.accept(splitOperator.apply(v))) - ); - }); + record.transformField(params.get(0), (m, c) -> m + .ifArray(a -> c.accept(newArray(a.stream().map(Value::asString).map(splitOperator)))) + .ifHash(h -> c.accept(Value.newHash(n -> h.forEach((f, w) -> n.put(f, splitOperator.apply(w.asString())))))) + .ifString(s -> c.accept(splitOperator.apply(s))) + ); } }, substring { @@ -401,9 +390,9 @@ public void apply(final Metafix metafix, final Record record, final List }, sum { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> v.extractType((m, c) -> m + record.transformField(params.get(0), (m, c) -> m .ifArray(a -> c.accept(new Value(a.stream().map(Value::asString).mapToInt(Integer::parseInt).sum()))) - )); + ); } }, trim { @@ -413,9 +402,9 @@ public void apply(final Metafix metafix, final Record record, final List }, uniq { public void apply(final Metafix metafix, final Record record, final List params, final Map options) { - record.transformField(params.get(0), v -> v.extractType((m, c) -> m + record.transformField(params.get(0), (m, c) -> m .ifArray(a -> c.accept(newArray(unique(a.stream())))) - )); + ); } }, upcase { diff --git a/metafix/src/main/java/org/metafacture/metafix/Value.java b/metafix/src/main/java/org/metafacture/metafix/Value.java index 58fdb5a9..f0eae12d 100644 --- a/metafix/src/main/java/org/metafacture/metafix/Value.java +++ b/metafix/src/main/java/org/metafacture/metafix/Value.java @@ -210,7 +210,7 @@ public TypeMatcher matchType() { return new TypeMatcher(this); } - public T extractType(final BiConsumer> consumer) { + private T extractType(final BiConsumer> consumer) { final AtomicReference result = new AtomicReference<>(); consumer.accept(matchType(), result::set); return result.get(); @@ -839,11 +839,11 @@ private void appendValue(final String[] newName, final Value v) { } } - public void transformField(final String field, final UnaryOperator operator) { + public void transformField(final String field, final BiConsumer> consumer) { final Value oldValue = find(field); if (oldValue != null) { - final Value newValue = operator.apply(oldValue); + final Value newValue = oldValue.extractType(consumer); if (newValue != null) { insert(InsertMode.REPLACE, split(field), newValue);