Skip to content
This repository has been archived by the owner on Jan 27, 2025. It is now read-only.

Commit

Permalink
Refactor field transformation. (#103)
Browse files Browse the repository at this point in the history
  • Loading branch information
blackwinter committed Jan 11, 2022
1 parent 51446ee commit 863a9f4
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 65 deletions.
113 changes: 51 additions & 62 deletions metafix/src/main/java/org/metafacture/metafix/FixMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -194,15 +193,13 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
rename {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> 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 {
Expand Down Expand Up @@ -268,10 +265,10 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
count {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> 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 {
Expand All @@ -281,15 +278,14 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
filter {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> 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<Value> 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<Value> 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 {
Expand All @@ -300,12 +296,10 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
join_field {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> 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 {
Expand Down Expand Up @@ -345,53 +339,48 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
reverse {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> options) {
record.transformField(params.get(0), v -> v.extractType((m, c) -> m
record.transformField(params.get(0), (m, c) -> m
.ifArray(a -> {
final List<Value> list = v.asArray().stream().collect(Collectors.toList());
final List<Value> 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<String> params, final Map<String, String> 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<Value, String> function = Value::asString;
final Comparator<Value> comparator = numeric ?
Comparator.comparing(function.andThen(Integer::parseInt)) : Comparator.comparing(function);

return v.extractType((m, c) -> m
.ifArray(a -> {
final Stream<Value> 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<Value, String> function = Value::asString;
final Comparator<Value> comparator = numeric ?
Comparator.comparing(function.andThen(Integer::parseInt)) : Comparator.comparing(function);

record.transformField(params.get(0), (m, c) -> m
.ifArray(a -> {
final Stream<Value> 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<String> params, final Map<String, String> 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<Value> splitOperator = s ->
newArray(Arrays.stream(splitPattern.split(s.asString())).map(Value::new));
final Function<String, Value> 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 {
Expand All @@ -401,9 +390,9 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
sum {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> 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 {
Expand All @@ -413,9 +402,9 @@ public void apply(final Metafix metafix, final Record record, final List<String>
},
uniq {
public void apply(final Metafix metafix, final Record record, final List<String> params, final Map<String, String> 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 {
Expand Down
6 changes: 3 additions & 3 deletions metafix/src/main/java/org/metafacture/metafix/Value.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ public TypeMatcher matchType() {
return new TypeMatcher(this);
}

public <T> T extractType(final BiConsumer<TypeMatcher, Consumer<T>> consumer) {
private <T> T extractType(final BiConsumer<TypeMatcher, Consumer<T>> consumer) {
final AtomicReference<T> result = new AtomicReference<>();
consumer.accept(matchType(), result::set);
return result.get();
Expand Down Expand Up @@ -839,11 +839,11 @@ private void appendValue(final String[] newName, final Value v) {
}
}

public void transformField(final String field, final UnaryOperator<Value> operator) {
public void transformField(final String field, final BiConsumer<TypeMatcher, Consumer<Value>> 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);
Expand Down

0 comments on commit 863a9f4

Please sign in to comment.