2021-10-19 16:46:00 +02:00
|
|
|
package org.gcube.informationsystem.resourceregistry.query.json.base.relations;
|
2021-10-14 15:01:22 +02:00
|
|
|
|
|
|
|
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;
|
2021-10-18 16:23:41 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException;
|
2021-10-14 15:01:22 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.query.InvalidQueryException;
|
2021-10-18 16:23:41 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaException;
|
2021-10-19 16:46:00 +02:00
|
|
|
import org.gcube.informationsystem.resourceregistry.query.json.base.entities.JsonQueryResource;
|
2021-10-14 15:01:22 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Luca Frosini (ISTI - CNR)
|
|
|
|
*/
|
2021-10-19 16:46:00 +02:00
|
|
|
public class JsonQueryIsRelatedTo extends JsonQueryRelation {
|
2021-10-14 15:01:22 +02:00
|
|
|
|
|
|
|
protected String requestedResourceType;
|
|
|
|
|
2021-10-18 16:23:41 +02:00
|
|
|
public JsonQueryIsRelatedTo(JsonNode jsonQuery) throws SchemaException, ResourceRegistryException {
|
2021-10-14 15:01:22 +02:00
|
|
|
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-20 12:05:34 +02:00
|
|
|
stringBuffer.append(addConstraints(jsonNode, null, null));
|
2021-10-15 11:33:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return stringBuffer;
|
|
|
|
}
|
|
|
|
|
2021-10-14 15:01:22 +02:00
|
|
|
@Override
|
2021-10-19 16:46:00 +02:00
|
|
|
public StringBuffer analize(StringBuffer stringBuffer) throws SchemaException, ResourceRegistryException {
|
2021-10-14 15:01:22 +02:00
|
|
|
|
2021-10-14 18:03:55 +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);
|
2021-10-14 18:03:55 +02:00
|
|
|
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-14 18:03:55 +02:00
|
|
|
|
2021-10-15 11:33:07 +02:00
|
|
|
return stringBuffer;
|
2021-10-14 15:01:22 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|