Added functionality to instantiate query from template using default
values or provided values
This commit is contained in:
parent
05b06ce6fa
commit
1d93d60bdf
|
@ -2,12 +2,15 @@ package org.gcube.informationsystem.queries.templates.impl.entities;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName;
|
import org.gcube.com.fasterxml.jackson.annotation.JsonTypeName;
|
||||||
import org.gcube.com.fasterxml.jackson.core.JsonProcessingException;
|
import org.gcube.com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
|
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
|
||||||
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
|
import org.gcube.com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode;
|
||||||
|
import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import org.gcube.informationsystem.base.impl.entities.EntityElementImpl;
|
import org.gcube.informationsystem.base.impl.entities.EntityElementImpl;
|
||||||
import org.gcube.informationsystem.queries.templates.reference.entities.QueryTemplate;
|
import org.gcube.informationsystem.queries.templates.reference.entities.QueryTemplate;
|
||||||
import org.gcube.informationsystem.queries.templates.reference.properties.TemplateVariable;
|
import org.gcube.informationsystem.queries.templates.reference.properties.TemplateVariable;
|
||||||
|
@ -29,8 +32,10 @@ public class QueryTemplateImpl extends EntityElementImpl implements QueryTemplat
|
||||||
protected ObjectMapper objectMapper;
|
protected ObjectMapper objectMapper;
|
||||||
protected JsonNode template;
|
protected JsonNode template;
|
||||||
|
|
||||||
|
|
||||||
protected Map<String, TemplateVariable> templateVariables;
|
protected Map<String, TemplateVariable> templateVariables;
|
||||||
|
protected JsonNode params;
|
||||||
|
|
||||||
public QueryTemplateImpl() {
|
public QueryTemplateImpl() {
|
||||||
this.templateVariables = new HashMap<>();
|
this.templateVariables = new HashMap<>();
|
||||||
this.objectMapper = new ObjectMapper();
|
this.objectMapper = new ObjectMapper();
|
||||||
|
@ -87,4 +92,59 @@ public class QueryTemplateImpl extends EntityElementImpl implements QueryTemplat
|
||||||
this.templateVariables.put(name, templateVariable);
|
this.templateVariables.put(name, templateVariable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonNode getJsonQuery() throws Exception {
|
||||||
|
ObjectNode objectNode = objectMapper.createObjectNode();
|
||||||
|
for(TemplateVariable tv : templateVariables.values()) {
|
||||||
|
objectNode.put(tv.getName(), tv.getDefaultValue());
|
||||||
|
}
|
||||||
|
return getJsonQuery(objectNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected JsonNode replaceVariables(JsonNode jsonNode) throws Exception {
|
||||||
|
Iterator<String> fieldNames = jsonNode.fieldNames();
|
||||||
|
while(fieldNames.hasNext()) {
|
||||||
|
String fieldName = fieldNames.next();
|
||||||
|
JsonNode node = jsonNode.get(fieldName);
|
||||||
|
switch (node.getNodeType()) {
|
||||||
|
case OBJECT:
|
||||||
|
node = replaceVariables(node);
|
||||||
|
((ObjectNode) jsonNode).set(fieldName, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
ArrayNode arrayNode = (ArrayNode) node;
|
||||||
|
for(int i = 0; i < arrayNode.size(); i++) {
|
||||||
|
JsonNode arrayElement = arrayNode.get(i);
|
||||||
|
arrayElement = replaceVariables(arrayElement);
|
||||||
|
arrayNode.set(i, arrayElement);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
String value = node.asText();
|
||||||
|
if(templateVariables.containsKey(value)) {
|
||||||
|
JsonNode jn = params.get(value);
|
||||||
|
if(jn == null) {
|
||||||
|
throw new Exception("No value provided for " + value + " variables");
|
||||||
|
}
|
||||||
|
((ObjectNode) jsonNode).set(fieldName, jn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return jsonNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonNode getJsonQuery(JsonNode values) throws Exception {
|
||||||
|
this.params = values;
|
||||||
|
JsonNode query = template.deepCopy();
|
||||||
|
query = replaceVariables(query);
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,4 +69,17 @@ public interface QueryTemplate extends EntityElement {
|
||||||
*/
|
*/
|
||||||
public void addTemplateVariable(TemplateVariable templateVariable);
|
public void addTemplateVariable(TemplateVariable templateVariable);
|
||||||
|
|
||||||
}
|
/**
|
||||||
|
* @return the JsonQuery replacing the variables using the default values contained in TemplateVariables
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public JsonNode getJsonQuery() throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param values
|
||||||
|
* @return the JsonQuery replacing the variables using the provided values
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public JsonNode getJsonQuery(JsonNode values) throws Exception;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue