package com.orientechnologies.orient.core.sql.parser; import com.orientechnologies.orient.core.sql.OCommandSQLParsingException; import java.util.LinkedHashMap; import java.util.Map; /** * Created by luigidellaquila on 28/07/15. */ class Pattern { Map<String, PatternNode> aliasToNode = new LinkedHashMap<String, PatternNode>(); int numOfEdges = 0; void addExpression(OMatchExpression expression) { PatternNode originNode = getOrCreateNode(expression.origin); for (OMatchPathItem item : expression.items) { String nextAlias = item.filter.getAlias(); PatternNode nextNode = getOrCreateNode(item.filter); numOfEdges += originNode.addEdge(item, nextNode); originNode = nextNode; } } private PatternNode getOrCreateNode(OMatchFilter origin) { PatternNode originNode = get(origin.getAlias()); if (originNode == null) { originNode = new PatternNode(); originNode.alias = origin.getAlias(); aliasToNode.put(originNode.alias, originNode); } if (origin.isOptional()) { originNode.optional = true; } return originNode; } PatternNode get(String alias) { return aliasToNode.get(alias); } int getNumOfEdges() { return numOfEdges; } public void validate() { for (PatternNode node : this.aliasToNode.values()) { if (node.isOptionalNode()) { if (node.out.size() > 0) { throw new OCommandSQLParsingException( "In current MATCH version, optional nodes are allowed only on right terminal nodes, eg. {} --> {optional:true} is allowed, {optional:true} <-- {} is not. "); } if(node.in.size()==0){ throw new OCommandSQLParsingException( "In current MATCH version, optional nodes must have at least one incoming pattern edge"); } // if (node.in.size() != 1) { // throw new OCommandSQLParsingException("In current MATCH version, optional nodes are allowed only as single terminal nodes. "); // } } } } }