/** * Alipay.com Inc. * Copyright (c) 2004-2013 All Rights Reserved. */ package com.alipay.zdal.parser.result; import java.util.List; import java.util.Set; import com.alipay.zdal.parser.exceptions.SqlParserException; import com.alipay.zdal.parser.sql.ast.expr.SQLBinaryOperator; import com.alipay.zdal.parser.visitor.BindVarCondition; import com.alipay.zdal.parser.visitor.ZdalDB2SchemaStatVisitor; import com.alipay.zdal.parser.visitor.ZdalSchemaStatVisitor; /** * ���ڷ��ؽ���DB2��sql���Ľ����������Ҫ�νӵ��ϲ�ķֿ�ֱ���. * @author ���� * @version $Id: DB2SqlParserResult.java, v 0.1 2013-12-27 ����06:38:43 Exp $ */ public class DB2SqlParserResult extends DefaultSqlParserResult { public DB2SqlParserResult(ZdalSchemaStatVisitor visitor) { super(visitor); } /** * @see com.alipay.zdal.parser.result.SqlParserResult#getMax(java.util.List) */ public int getMax(List<Object> arguments) { ZdalDB2SchemaStatVisitor oracleVisitor = (ZdalDB2SchemaStatVisitor) visitor; Set<BindVarCondition> rowNums = oracleVisitor.getRownums(); if (rowNums == null || rowNums.isEmpty()) { return DEFAULT_SKIP_MAX; } int result = DEFAULT_SKIP_MAX; //���һ��sql����а�������rownum���������ܻ�������. for (BindVarCondition rowNum : rowNums) { if (ZdalSchemaStatVisitor.ROWCOUNT.equalsIgnoreCase(rowNum.getColumnName())) { //����ǰ󶨲������ʹӲ����б��л�ȡrowcount��ֵ. if (rowNum.getValue() == null) { Object obj = arguments.get(rowNum.getIndex()); if (obj instanceof Long) { throw new SqlParserException("ERROR ## row selecter can't handle long data"); } else if (obj instanceof Integer) { int tmp = ((Integer) obj).intValue(); if (rowNum.getOperator().equals(SQLBinaryOperator.LessThan.name)) {//�����С�ڣ�����Ҫ��һ tmp = tmp - 1; } if (tmp > result) { result = tmp; } } else { throw new SqlParserException("ERROR ## bind rowcount var has an error , " + obj + " is not a int value"); } } else {//��sql����л�ȡrowcount��ֵ. Comparable<?> tmp = rowNum.getValue(); if (tmp instanceof Number) { int rowcount = ((Integer) tmp).intValue(); if (rowNum.getOperator().equals(SQLBinaryOperator.LessThan.name)) {//�����С�ڣ�����Ҫ��һ rowcount = rowcount - 1; } if (rowcount > result) { result = rowcount; } } else { throw new SqlParserException("ERROR ## get rowcount's value has an error," + tmp + " is not a int value"); } } } } return result; } /** * @see com.alipay.zdal.parser.result.SqlParserResult#getSkip(java.util.List) */ public int getSkip(List<Object> arguments) { ZdalDB2SchemaStatVisitor oracleVisitor = (ZdalDB2SchemaStatVisitor) visitor; Set<BindVarCondition> rowNums = oracleVisitor.getRownums(); if (rowNums == null || rowNums.isEmpty()) { return DEFAULT_SKIP_MAX; } int result = DEFAULT_SKIP_MAX; //���һ��sql����а�������offset���������ܻ�������. for (BindVarCondition rowNum : rowNums) { if (ZdalSchemaStatVisitor.OFFSET.equals(rowNum.getColumnName())) { //����ǰ󶨲������ʹӲ����б��л�ȡoffset��ֵ. if (rowNum.getValue() == null) { Object obj = arguments.get(rowNum.getIndex()); if (obj instanceof Long) { throw new SqlParserException("ERROR ## row selecter can't handle long data"); } else if (obj instanceof Integer) { int tmp = ((Integer) obj).intValue(); if (rowNum.getOperator().equals(SQLBinaryOperator.GreaterThanOrEqual.name)) {//����Ǵ��ڵ��ڣ�����Ҫ��һ tmp = tmp - 1; } if (tmp > result) { result = tmp; } } else { throw new SqlParserException("ERROR ## bind offset var has an error , " + obj + " is not a int value"); } } else {//��sql����л�ȡrowcount��ֵ. Comparable<?> tmp = rowNum.getValue(); if (tmp instanceof Number) { int offset = ((Integer) tmp).intValue(); if (rowNum.getOperator().equals(SQLBinaryOperator.GreaterThanOrEqual.name)) {//����Ǵ��ڵ��ڣ�����Ҫ��һ offset = offset - 1; } if (offset > result) { result = offset; } } else { throw new SqlParserException("ERROR ## get offset's value has an error," + tmp + " is not a int value"); } } } } return result; } /** * @see com.alipay.zdal.parser.result.SqlParserResult#isRowCountBind() */ public int isRowCountBind() { ZdalDB2SchemaStatVisitor db2SchemaVisitor = (ZdalDB2SchemaStatVisitor) visitor; Set<BindVarCondition> rowNums = db2SchemaVisitor.getRownums(); if (rowNums == null || rowNums.isEmpty()) { return -1; } for (BindVarCondition rowNum : rowNums) { if (ZdalSchemaStatVisitor.ROWCOUNT.equalsIgnoreCase(rowNum.getColumnName())) { if (rowNum.getValue() == null) { return rowNum.getIndex(); } else { return -1; } } } return -1; } /** * @see com.alipay.zdal.parser.result.SqlParserResult#isSkipBind() */ public int isSkipBind() { ZdalDB2SchemaStatVisitor oracleVisitor = (ZdalDB2SchemaStatVisitor) visitor; Set<BindVarCondition> rowNums = oracleVisitor.getRownums(); if (rowNums == null || rowNums.isEmpty()) { return -1; } for (BindVarCondition rowNum : rowNums) { if (ZdalSchemaStatVisitor.OFFSET.equalsIgnoreCase(rowNum.getColumnName())) { if (rowNum.getValue() == null) { return rowNum.getIndex(); } else { return -1; } } } return -1; } }