From 6e985eec658b3124d87f11d45be43da68e76c712 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Fri, 22 Oct 2021 11:11:01 +0200 Subject: [PATCH] Moved Query Conditional and Logical operators in a dedicated package --- .../contexts/entities/ContextManagement.java | 84 +++++++++----- .../query/json/base/JsonQueryERElement.java | 2 + .../QueryConditionalOperator.java | 2 +- .../QueryLogicalOperator.java | 2 +- .../templates/QueryTemplateManagement.java | 105 ++++++++++++++---- 5 files changed, 141 insertions(+), 54 deletions(-) rename src/main/java/org/gcube/informationsystem/resourceregistry/query/{json/base => operators}/QueryConditionalOperator.java (96%) rename src/main/java/org/gcube/informationsystem/resourceregistry/query/{json/base => operators}/QueryLogicalOperator.java (95%) diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java index 7350d6d..9a570e5 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java @@ -33,6 +33,8 @@ import org.gcube.informationsystem.resourceregistry.contexts.relations.IsParentO import org.gcube.informationsystem.resourceregistry.contexts.security.ContextSecurityContext; import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext; import org.gcube.informationsystem.resourceregistry.instances.base.entities.EntityElementManagement; +import org.gcube.informationsystem.resourceregistry.query.operators.QueryConditionalOperator; +import org.gcube.informationsystem.resourceregistry.query.operators.QueryLogicalOperator; import org.gcube.informationsystem.resourceregistry.utils.Utility; import org.gcube.informationsystem.types.reference.entities.EntityType; import org.gcube.informationsystem.utils.ElementMapper; @@ -128,41 +130,63 @@ public class ContextManagement extends EntityElementManagement\"" + parentContext.uuid + "\""; - - logger.trace(select); - - StringBuilder message = new StringBuilder(); - message.append("A context with name ("); - message.append(getName()); - message.append(") has been already created as child of "); - message.append(parentContext.getElement().toString()); - - logger.trace("Checking if {} -> {}", message, select); - - OResultSet resultSet = oDatabaseDocument.command(select, new HashMap<>()); - - if (resultSet != null && resultSet.hasNext()) { - throw new ContextAlreadyPresentException(message.toString()); - } - + select.append("SELECT FROM (TRAVERSE out("); + select.append(IsParentOf.NAME); + select.append(") FROM "); + select.append(parentId); + select.append(" MAXDEPTH 1) WHERE "); + select.append(Context.NAME_PROPERTY); + select.append(QueryConditionalOperator.EQ.getConditionalOperator()); + select.append("\""); + select.append(getName()); + select.append("\""); + select.append(QueryLogicalOperator.AND.getLogicalOperator()); + select.append(Context.HEADER_PROPERTY); + select.append(Header.UUID_PROPERTY); + select.append(QueryConditionalOperator.NE.getConditionalOperator()); + select.append("\""); + select.append(parentContext.uuid); + select.append("\""); + + errorMessage.append("A root "); + errorMessage.append(Context.NAME); + errorMessage.append(" with "); + errorMessage.append(this.getName()); + errorMessage.append(" has been already created as child of "); + errorMessage.append(parentContext.getElement().toString()); } else { - String select = "SELECT FROM " + Context.NAME + " WHERE " + Context.NAME_PROPERTY + " = \"" + getName() - + "\"" + " AND in(\"" + IsParentOf.NAME + "\").size() = 0"; - - OResultSet resultSet = oDatabaseDocument.command(select, new HashMap<>()); - - if (resultSet != null && resultSet.hasNext()) { - throw new ContextAlreadyPresentException( - "A root context with the same name (" + this.getName() + ") already exist"); - } + select.append("SELECT FROM "); + select.append(Context.NAME); + select.append(" WHERE "); + select.append(Context.NAME_PROPERTY); + select.append(QueryConditionalOperator.EQ.getConditionalOperator()); + select.append("\""); + select.append(getName()); + select.append("\""); + select.append(QueryLogicalOperator.AND.getLogicalOperator()); + select.append("in(\""); + select.append(IsParentOf.NAME); + select.append("\").size() = 0"); + + errorMessage.append("A root "); + errorMessage.append(Context.NAME); + errorMessage.append(" with "); + errorMessage.append(this.getName()); + errorMessage.append(" already exist"); + } + + logger.trace("Checking if {} -> {}", errorMessage, select); + OResultSet resultSet = oDatabaseDocument.command(select.toString(), new HashMap<>()); + if (resultSet != null && resultSet.hasNext()) { + throw new ContextAlreadyPresentException(errorMessage.toString()); } } diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/JsonQueryERElement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/JsonQueryERElement.java index e35eb4a..7c69f2a 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/JsonQueryERElement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/JsonQueryERElement.java @@ -15,6 +15,8 @@ import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegis import org.gcube.informationsystem.resourceregistry.api.exceptions.query.InvalidQueryException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaException; import org.gcube.informationsystem.resourceregistry.api.exceptions.schema.SchemaNotFoundException; +import org.gcube.informationsystem.resourceregistry.query.operators.QueryConditionalOperator; +import org.gcube.informationsystem.resourceregistry.query.operators.QueryLogicalOperator; import org.gcube.informationsystem.resourceregistry.types.TypesCache; public abstract class JsonQueryERElement { diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/QueryConditionalOperator.java b/src/main/java/org/gcube/informationsystem/resourceregistry/query/operators/QueryConditionalOperator.java similarity index 96% rename from src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/QueryConditionalOperator.java rename to src/main/java/org/gcube/informationsystem/resourceregistry/query/operators/QueryConditionalOperator.java index 3879e33..58815d8 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/QueryConditionalOperator.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/query/operators/QueryConditionalOperator.java @@ -1,4 +1,4 @@ -package org.gcube.informationsystem.resourceregistry.query.json.base; +package org.gcube.informationsystem.resourceregistry.query.operators; import java.util.HashMap; import java.util.HashSet; diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/QueryLogicalOperator.java b/src/main/java/org/gcube/informationsystem/resourceregistry/query/operators/QueryLogicalOperator.java similarity index 95% rename from src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/QueryLogicalOperator.java rename to src/main/java/org/gcube/informationsystem/resourceregistry/query/operators/QueryLogicalOperator.java index 19f19bd..388954c 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/query/json/base/QueryLogicalOperator.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/query/operators/QueryLogicalOperator.java @@ -1,4 +1,4 @@ -package org.gcube.informationsystem.resourceregistry.query.json.base; +package org.gcube.informationsystem.resourceregistry.query.operators; import java.util.HashMap; import java.util.HashSet; diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/query/templates/QueryTemplateManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/query/templates/QueryTemplateManagement.java index 6017f91..526be48 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/query/templates/QueryTemplateManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/query/templates/QueryTemplateManagement.java @@ -1,12 +1,16 @@ package org.gcube.informationsystem.resourceregistry.query.templates; +import java.util.HashMap; + import org.gcube.com.fasterxml.jackson.databind.JsonNode; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.context.reference.entities.Context; import org.gcube.informationsystem.query.templates.reference.entities.QueryTemplate; +import org.gcube.informationsystem.resourceregistry.api.contexts.ContextCache; import org.gcube.informationsystem.resourceregistry.api.exceptions.AlreadyPresentException; import org.gcube.informationsystem.resourceregistry.api.exceptions.NotFoundException; import org.gcube.informationsystem.resourceregistry.api.exceptions.ResourceRegistryException; +import org.gcube.informationsystem.resourceregistry.api.exceptions.query.InvalidQueryException; import org.gcube.informationsystem.resourceregistry.contexts.ContextUtility; import org.gcube.informationsystem.resourceregistry.contexts.security.QueryTemplatesSecurityContext; import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityContext; @@ -17,6 +21,7 @@ import org.slf4j.LoggerFactory; import com.orientechnologies.orient.core.db.document.ODatabaseDocument; import com.orientechnologies.orient.core.record.OVertex; +import com.orientechnologies.orient.core.sql.executor.OResultSet; /** * @author Luca Frosini (ISTI - CNR) @@ -27,13 +32,9 @@ public class QueryTemplateManagement extends EntityElementManagement {}", errorMessage, select); + + OResultSet resultSet = oDatabaseDocument.command(select.toString(), new HashMap<>()); + + if (resultSet != null && resultSet.hasNext()) { + throw new AlreadyPresentException(errorMessage.toString()); + } + } + + protected void tryTemplate() throws InvalidQueryException { } @Override - protected JsonNode createCompleteJsonNode() throws ResourceRegistryException { - // TODO Auto-generated method stub - return null; - } - - @Override - protected OVertex reallyCreate() throws AlreadyPresentException, ResourceRegistryException { - // TODO Auto-generated method stub - return null; + protected OVertex reallyCreate() throws AlreadyPresentException, InvalidQueryException, ResourceRegistryException { + try { + checkIfNameAlreadyExists(); + tryTemplate(); + createVertex(); + return getElement(); + } catch(ResourceRegistryException e) { + throw e; + } catch(Exception e) { + logger.trace("Error while creating {} for {} ({}) using {}", OVertex.class.getSimpleName(), + accessType.getName(), typeName, jsonNode, e); + throw new ResourceRegistryException("Error Creating " + typeName + " with " + jsonNode, e.getCause()); + } } @Override protected OVertex reallyUpdate() throws NotFoundException, ResourceRegistryException { - // TODO Auto-generated method stub - return null; + try { + + tryTemplate(); + return getElement(); + } catch(ResourceRegistryException e) { + throw e; + } catch(Exception e) { + logger.trace("Error while creating {} for {} ({}) using {}", OVertex.class.getSimpleName(), + accessType.getName(), typeName, jsonNode, e); + throw new ResourceRegistryException("Error Creating " + typeName + " with " + jsonNode, e.getCause()); + } } @Override @@ -82,14 +145,12 @@ public class QueryTemplateManagement extends EntityElementManagement