diff options
Diffstat (limited to 'catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/CypherTranslator.java')
-rw-r--r-- | catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/CypherTranslator.java | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/CypherTranslator.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/CypherTranslator.java new file mode 100644 index 0000000000..2f53736c59 --- /dev/null +++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/CypherTranslator.java @@ -0,0 +1,251 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.dao.neo4j; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.openecomp.sdc.be.dao.graph.datatype.GraphElement; +import org.openecomp.sdc.be.dao.graph.datatype.GraphNode; +import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation; +import org.openecomp.sdc.be.dao.graph.datatype.RelationEndPoint; +import org.openecomp.sdc.be.dao.neo4j.filters.MatchFilter; +import org.openecomp.sdc.be.dao.neo4j.filters.RecursiveByRelationFilter; +import org.openecomp.sdc.be.dao.neo4j.filters.RecursiveFilter; +import org.openecomp.sdc.be.dao.utils.DaoUtils; + +import java.util.List; +import java.util.Map; + +public class CypherTranslator { + + public String translate(BatchBuilder builder) { + String json = null; + StringBuilder statementList = new StringBuilder(); + + List<GraphElement> elements = builder.getElements(); + int statementCounter = 0; + for (GraphElement element : elements) { + String singleStatementBody = null; + switch (element.getElementType()) { + case Node: + singleStatementBody = prepareNodeStatement(element); + break; + case Relationship: + singleStatementBody = prepareRelationStatement(element); + break; + } + if (singleStatementBody != null && !singleStatementBody.isEmpty()) { + + String singleStatement = CypherTemplates.RegularStatementTemplate.replace("$statement$", + singleStatementBody); + + statementList.append(singleStatement); + } + ++statementCounter; + if (statementCounter < elements.size() && singleStatementBody != null) { + statementList.append(","); + } + + } + json = CypherTemplates.BatchTemplate.replace("$statementList$", statementList.toString()); + return json; + } + + private String prepareNodeStatement(GraphElement element) { + if (element instanceof GraphNode) { + GraphNode node = (GraphNode) element; + + switch (node.getAction()) { + case Create: + return createNodeStatement(node); + case Update: + return updateNodeStatement(node); + case Delete: + // TODO + break; + default: + break; + } + } + return null; + } + + private String updateNodeStatement(GraphNode node) { + String singleStatement = CypherTemplates.UpdateNodeStatementTemplate.replace("$label$", node.getLabel()); + String filter = prepareKeyValueFilter(node); + + singleStatement = singleStatement.replace("$filter$", filter); + + singleStatement = singleStatement.replace("$props$", DaoUtils.convertToJson(node.toGraphMap())); + + return singleStatement; + } + + private String createNodeStatement(GraphNode node) { + String singleStatement = CypherTemplates.CreateSingleNodeTemplate.replace("$label$", node.getLabel()); + + singleStatement = singleStatement.replace("$props$", DaoUtils.convertToJson(node.toGraphMap())); + return singleStatement; + } + + private String prepareRelationStatement(GraphElement element) { + if (element instanceof GraphRelation) { + + GraphRelation relation = (GraphRelation) element; + + switch (relation.getAction()) { + case Create: + return createRelationStatement(relation); + case Update: + return updateRelationStatement(relation); + case Delete: + // TODO + break; + default: + break; + } + } + return null; + } + + private String createRelationStatement(GraphRelation relation) { + RelationEndPoint from = relation.getFrom(); + String singleStatement; + + Map<String, Object> props = relation.toGraphMap(); + if (props == null || props.isEmpty()) { + singleStatement = CypherTemplates.CreateRelationTemplateNoProps.replace("$labelFrom$", + from.getLabel().getName()); + } else { + singleStatement = CypherTemplates.CreateRelationTemplate.replace("$labelFrom$", from.getLabel().getName()); + singleStatement = singleStatement.replace("$props$", DaoUtils.convertToJson(props)); + } + + singleStatement = singleStatement.replace("$idNameFrom$", from.getIdName()); + singleStatement = singleStatement.replace("$idValueFrom$", from.getIdValue().toString()); + + RelationEndPoint to = relation.getTo(); + singleStatement = singleStatement.replace("$labelTo$", to.getLabel().getName()); + singleStatement = singleStatement.replace("$idNameTo$", to.getIdName()); + singleStatement = singleStatement.replace("$idvalueTo$", to.getIdValue().toString()); + + singleStatement = singleStatement.replace("$type$", relation.getType()); + return singleStatement; + } + + private String updateRelationStatement(GraphRelation relation) { + // TODO + return null; + } + + private String prepareKeyValueFilter(GraphNode node) { + StringBuilder sb = new StringBuilder(); + + ImmutablePair<String, Object> keyValueId = node.getKeyValueId(); + + sb.append(keyValueId.getKey()).append(":"); + if (keyValueId.getValue() instanceof String) { + sb.append("'"); + } + sb.append(keyValueId.getValue()); + + if (keyValueId.getValue() instanceof String) { + sb.append("'"); + } + + return sb.toString(); + } + + public String translateGet(RecursiveFilter filter) { + String requestJson = null; + String statement; + + if (filter instanceof RecursiveByRelationFilter) { + RecursiveByRelationFilter byRelationFilter = (RecursiveByRelationFilter) filter; + + statement = CypherTemplates.GetByRelationNodeRecursiveTemplate.replace("$labelNode$", + byRelationFilter.getNode().getLabel()); + String keyValueId = prepareKeyValueFilter(byRelationFilter.getNode()); + + statement = statement.replace("$propsNode$", keyValueId); + + statement = statement.replace("$type$", byRelationFilter.getRelationType()); + + String relationProps = prepareFilterBody(filter); + statement = statement.replace("$propsRel$", relationProps); + statement = statement.replace("$labelSrc$", filter.getNodeType().getName()); + + } else { + + statement = CypherTemplates.GetNodeRecursiveTemplate.replace("$label$", filter.getNodeType().getName()); + + // replace filter + if (filter.getProperties().isEmpty()) { + // get all records by label + statement = statement.replace("{$filter$}", ""); + } else { + String filterStr = prepareFilterBody(filter); + statement = statement.replace("$filter$", filterStr); + } + } + + if (filter.getChildRelationTypes() == null || filter.getChildRelationTypes().isEmpty()) { + statement = statement.replace("$typesList$", ""); + + } else { + StringBuilder typesList = new StringBuilder(); + int count = 0; + for (String type : filter.getChildRelationTypes()) { + typesList.append(":").append(type); + ++count; + if (count < filter.getChildRelationTypes().size()) { + typesList.append("|"); + } + } + statement = statement.replace("$typesList$", typesList.toString()); + } + String singleStatement = CypherTemplates.RegularStatementTemplate.replace("$statement$", statement); + requestJson = CypherTemplates.BatchTemplate.replace("$statementList$", singleStatement); + + return requestJson; + } + + public static String prepareFilterBody(MatchFilter filter) { + StringBuilder sb = new StringBuilder(); + int count = 0; + int size = filter.getProperties().entrySet().size(); + for (Map.Entry<String, Object> entry : filter.getProperties().entrySet()) { + sb.append(entry.getKey()).append(":"); + if (entry.getValue() instanceof String) { + sb.append("'"); + } + sb.append(entry.getValue()); + if (entry.getValue() instanceof String) { + sb.append("'"); + } + ++count; + if (count < size) { + sb.append(","); + } + } + return sb.toString(); + } + +} |