Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package net.thisptr.jackson.jq.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.thisptr.jackson.jq.Function;
import net.thisptr.jackson.jq.JsonQuery;
import net.thisptr.jackson.jq.Scope;
import net.thisptr.jackson.jq.exception.JsonQueryException;
import net.thisptr.jackson.jq.internal.misc.Preconditions;
import com.fasterxml.jackson.databind.JsonNode;
public class JsonQueryFunction implements Function {
private JsonQuery body;
private List params;
private String name;
private Scope closure;
public JsonQueryFunction(final String name, final List params, final JsonQuery body, final Scope closure) {
this.name = name;
this.params = params;
this.body = body;
this.closure = closure;
}
@Override
public List apply(final Scope scope, final List args, final JsonNode in) throws JsonQueryException {
Preconditions.checkArgumentCount(name, args, params.size());
final Scope fnScope = Scope.newChildScope(closure);
fnScope.addFunction(name, params.size(), this);
final List out = new ArrayList<>();
applyRecursive(out, fnScope, scope, args, in, 0);
return out;
}
private void applyRecursive(final List out, final Scope fnScope, final Scope scope, final List args, final JsonNode in, final int i) throws JsonQueryException {
if (i == params.size()) {
out.addAll(body.apply(fnScope, in));
} else {
final String param = params.get(i);
if (param.startsWith("$")) {
final String argname = param.substring(1);
for (final JsonNode argvalue : args.get(i).apply(scope, in)) {
fnScope.setValue(argname, argvalue);
applyRecursive(out, fnScope, scope, args, in, i + 1);
}
} else {
fnScope.addFunction(param, 0, new JsonQueryFunction(param, Collections. emptyList(), new FixedScopeQuery(scope, args.get(i)), fnScope));
applyRecursive(out, fnScope, scope, args, in, i + 1);
}
}
}
}