@Override public SqlNode visit(SqlIdentifier id) { String maybeParam = id.toString(); int idx = ParamNodeParser.parseParamIdx(maybeParam); if (idx >= 0 && operands.containsKey(idx)) { SqlNode sqlNode = operands.get(idx); if (sqlNode instanceof SqlIdentifier) { return sqlNode; } else { return sqlNode.accept(SqlNodeConverter.this); } } return id; }
private void genParamPath(SqlNode sqlNode, List<Integer> path) { if (sqlNode instanceof SqlIdentifier) { int paramIdx = ParamNodeParser.parseParamIdx(sqlNode.toString()); if (paramIdx >= 0 && path.size() > 0) { paramPath.put(paramIdx, path); } } else if (sqlNode instanceof SqlCall) { List<SqlNode> operands = ((SqlCall) sqlNode).getOperandList(); for (int i = 0; i < operands.size(); i++) { List<Integer> copiedPath = Lists.newArrayList(path); copiedPath.add(i); genParamPath(operands.get(i), copiedPath); } } }
@Override public boolean isSqlIdentifierEqual(SqlIdentifier querySqlIdentifier, SqlIdentifier exprSqlIdentifier) { int parsedIdx = ParamNodeParser.parseParamIdx(exprSqlIdentifier.toString()); if (parsedIdx >= 0) { SqlNode matchedBefore = matchedNodesMap.get(parsedIdx); if (matchedBefore != null) { return ExpressionComparator.isNodeEqual(querySqlIdentifier, matchedBefore, this); } else { matchedNodesMap.put(parsedIdx, querySqlIdentifier); return true; } } else { return querySqlIdentifier.equalsDeep(exprSqlIdentifier, Litmus.IGNORE); } }
@Test public void testParseParamIdx() { Assert.assertEquals(-1, ParamNodeParser.parseParamIdx("t**t")); Assert.assertEquals(-1, ParamNodeParser.parseParamIdx(null)); Assert.assertEquals(-1, ParamNodeParser.parseParamIdx("")); Assert.assertEquals(-1, ParamNodeParser.parseParamIdx("1")); Assert.assertEquals(-1, ParamNodeParser.parseParamIdx("$$0")); Assert.assertEquals(-1, ParamNodeParser.parseParamIdx("$0$")); Assert.assertEquals(-1, ParamNodeParser.parseParamIdx("$10000000000000000000000000")); Assert.assertEquals(1, ParamNodeParser.parseParamIdx("$1")); Assert.assertEquals(0, ParamNodeParser.parseParamIdx("$0")); Assert.assertEquals(1, ParamNodeParser.parseParamIdx("$01")); } }
if (queryNode != null && exprNode != null) { if (exprNode instanceof SqlIdentifier) { int parsedIdx = ParamNodeParser.parseParamIdx(exprNode.toString()); if (parsedIdx >= 0) { SqlNode matchedBefore = matchedNodesMap.get(parsedIdx);
@Override public SqlNode visit(SqlIdentifier id) { String maybeParam = id.toString(); int idx = ParamNodeParser.parseParamIdx(maybeParam); if (idx >= 0 && operands.containsKey(idx)) { SqlNode sqlNode = operands.get(idx); if (sqlNode instanceof SqlIdentifier) { return sqlNode; } else { return sqlNode.accept(SqlNodeConverter.this); } } return id; }
private void genParamPath(SqlNode sqlNode, List<Integer> path) { if (sqlNode instanceof SqlIdentifier) { int paramIdx = ParamNodeParser.parseParamIdx(sqlNode.toString()); if (paramIdx >= 0 && path.size() > 0) { paramPath.put(paramIdx, path); } } else if (sqlNode instanceof SqlCall) { List<SqlNode> operands = ((SqlCall) sqlNode).getOperandList(); for (int i = 0; i < operands.size(); i++) { List<Integer> copiedPath = Lists.newArrayList(path); copiedPath.add(i); genParamPath(operands.get(i), copiedPath); } } }
@Override public boolean isSqlIdentifierEqual(SqlIdentifier querySqlIdentifier, SqlIdentifier exprSqlIdentifier) { int parsedIdx = ParamNodeParser.parseParamIdx(exprSqlIdentifier.toString()); if (parsedIdx >= 0) { SqlNode matchedBefore = matchedNodesMap.get(parsedIdx); if (matchedBefore != null) { return ExpressionComparator.isNodeEqual(querySqlIdentifier, matchedBefore, this); } else { matchedNodesMap.put(parsedIdx, querySqlIdentifier); return true; } } else { return querySqlIdentifier.equalsDeep(exprSqlIdentifier, Litmus.IGNORE); } }
if (queryNode != null && exprNode != null) { if (exprNode instanceof SqlIdentifier) { int parsedIdx = ParamNodeParser.parseParamIdx(exprNode.toString()); if (parsedIdx >= 0) { SqlNode matchedBefore = matchedNodesMap.get(parsedIdx);