resource-registry/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/JsonQueryIsRelatedTo.java

121 lines
3.3 KiB
Java
Raw Normal View History

2021-10-14 15:01:22 +02:00
package org.gcube.informationsystem.resourceregistry.query.json;
import org.gcube.com.fasterxml.jackson.databind.JsonNode;
import org.gcube.informationsystem.base.reference.AccessType;
import org.gcube.informationsystem.base.reference.Direction;
import org.gcube.informationsystem.model.reference.relations.ConsistsOf;
import org.gcube.informationsystem.resourceregistry.api.exceptions.query.InvalidQueryException;
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class JsonQueryIsRelatedTo extends JsonQueryERElement{
protected String requestedResourceType;
public JsonQueryIsRelatedTo(JsonNode jsonQuery) throws SchemaNotFoundException {
super(jsonQuery, AccessType.IS_RELATED_TO);
}
public String getRequestedResourceType() {
return requestedResourceType;
}
public void setRequestedResourceType(String requestedResourceType) {
this.requestedResourceType = requestedResourceType;
}
2021-10-15 11:33:07 +02:00
private StringBuffer traverseThisEdge(StringBuffer stringBuffer) throws InvalidQueryException {
StringBuffer buffer = new StringBuffer();
int size = jsonNode.size();
if(size > 2) {
2021-10-15 17:27:45 +02:00
buffer.append("SELECT FROM ");
2021-10-15 15:43:56 +02:00
if(entryPoint) {
buffer.append(type);
2021-10-15 17:27:45 +02:00
}else {
buffer.append(" ( "); // Open ( SELECT
2021-10-15 15:43:56 +02:00
}
2021-10-15 17:27:45 +02:00
2021-10-15 15:43:56 +02:00
}else {
if(entryPoint) {
buffer.append("SELECT FROM ");
buffer.append(type);
}
2021-10-15 11:33:07 +02:00
}
2021-10-15 15:43:56 +02:00
if(!entryPoint) {
buffer.append("TRAVERSE ");
buffer.append(direction.opposite().name().toLowerCase());
buffer.append("E(\"");
buffer.append(type);
buffer.append("\") FROM ( ");
buffer.append(stringBuffer);
buffer.append(")");
}
2021-10-15 11:33:07 +02:00
stringBuffer = buffer;
// Size 2 means that only '@class' and 'target'/'source' properties are present
if(size > 2) {
2021-10-15 17:27:45 +02:00
if(!entryPoint) {
stringBuffer.append(" )"); // Close ) SELECT
}
stringBuffer.append(" WHERE ");
2021-10-15 11:33:07 +02:00
stringBuffer = addWhereConstraint(jsonNode, buffer, null);
}
return stringBuffer;
}
2021-10-14 15:01:22 +02:00
@Override
protected StringBuffer analize(StringBuffer stringBuffer) throws SchemaNotFoundException, InvalidQueryException {
2021-10-15 11:33:07 +02:00
2021-10-14 15:01:22 +02:00
JsonNode sourceJsonNode = jsonNode.get(ConsistsOf.SOURCE_PROPERTY);
JsonNode targetJsonNode = jsonNode.get(ConsistsOf.TARGET_PROPERTY);
2021-10-14 15:01:22 +02:00
JsonNode resourceJsonNode = null;
2021-10-15 11:33:07 +02:00
if(sourceJsonNode!=null) {
2021-10-14 15:01:22 +02:00
resourceJsonNode = sourceJsonNode;
direction = Direction.OUT;
2021-10-15 11:33:07 +02:00
} else if(targetJsonNode!=null) {
resourceJsonNode = targetJsonNode;
direction = Direction.IN;
2021-10-14 15:01:22 +02:00
}
2021-10-15 11:33:07 +02:00
stringBuffer = traverseThisEdge(stringBuffer);
2021-10-14 15:01:22 +02:00
JsonQueryResource jsonQueryResource = new JsonQueryResource(resourceJsonNode);
jsonQueryResource.setDirection(direction);
jsonQueryResource.setEntryPoint(false);
stringBuffer = jsonQueryResource.analize(stringBuffer);
2021-10-15 11:33:07 +02:00
StringBuffer buffer = new StringBuffer();
2021-10-15 15:43:56 +02:00
buffer.append("TRAVERSE ");
2021-10-15 11:33:07 +02:00
buffer.append(direction.opposite().name().toLowerCase());
buffer.append("V(\"");
buffer.append(requestedResourceType);
2021-10-15 15:43:56 +02:00
buffer.append("\") FROM ( ");
buffer.append("TRAVERSE ");
2021-10-15 11:33:07 +02:00
buffer.append(direction.name().toLowerCase());
buffer.append("E(\"");
buffer.append(type);
2021-10-15 15:43:56 +02:00
buffer.append("\") FROM ( ");
2021-10-15 11:33:07 +02:00
buffer.append(stringBuffer);
buffer.append(")");
2021-10-15 15:43:56 +02:00
buffer.append(")");
2021-10-15 11:33:07 +02:00
stringBuffer = buffer;
2021-10-15 11:33:07 +02:00
return stringBuffer;
2021-10-14 15:01:22 +02:00
}
}