Search in sources :

Example 11 with Column

use of net.sf.jsqlparser.schema.Column in project JSqlParser by JSQLParser.

the class UpsertDeParser method appendDuplicate.

private void appendDuplicate(Upsert upsert) {
    buffer.append(" ON DUPLICATE KEY UPDATE ");
    for (int i = 0; i < upsert.getDuplicateUpdateColumns().size(); i++) {
        Column column = upsert.getDuplicateUpdateColumns().get(i);
        buffer.append(column.getFullyQualifiedName()).append(" = ");
        Expression expression = upsert.getDuplicateUpdateExpressionList().get(i);
        expression.accept(expressionVisitor);
        if (i < upsert.getDuplicateUpdateColumns().size() - 1) {
            buffer.append(", ");
        }
    }
}
Also used : Column(net.sf.jsqlparser.schema.Column) Expression(net.sf.jsqlparser.expression.Expression)

Example 12 with Column

use of net.sf.jsqlparser.schema.Column in project Mybatis-PageHelper by pagehelper.

the class SqlServerParser method getSelectItems.

/**
 * 获取查询列
 *
 * @param plainSelect
 * @return
 */
protected List<SelectItem> getSelectItems(PlainSelect plainSelect) {
    // 设置selectItems
    List<SelectItem> selectItems = new ArrayList<SelectItem>();
    for (SelectItem selectItem : plainSelect.getSelectItems()) {
        // 别名需要特殊处理
        if (selectItem instanceof SelectExpressionItem) {
            SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
            if (selectExpressionItem.getAlias() != null) {
                // 直接使用别名
                Column column = new Column(selectExpressionItem.getAlias().getName());
                SelectExpressionItem expressionItem = new SelectExpressionItem(column);
                selectItems.add(expressionItem);
            } else if (selectExpressionItem.getExpression() instanceof Column) {
                Column column = (Column) selectExpressionItem.getExpression();
                SelectExpressionItem item = null;
                if (column.getTable() != null) {
                    Column newColumn = new Column(column.getColumnName());
                    item = new SelectExpressionItem(newColumn);
                    selectItems.add(item);
                } else {
                    selectItems.add(selectItem);
                }
            } else {
                selectItems.add(selectItem);
            }
        } else if (selectItem instanceof AllTableColumns) {
            selectItems.add(new AllColumns());
        } else {
            selectItems.add(selectItem);
        }
    }
    // SELECT *, alias FROM (SELECT *, 1 AS alias FROM TEST)
    for (SelectItem selectItem : selectItems) {
        if (selectItem instanceof AllColumns) {
            return Collections.singletonList(selectItem);
        }
    }
    return selectItems;
}
Also used : Column(net.sf.jsqlparser.schema.Column)

Example 13 with Column

use of net.sf.jsqlparser.schema.Column in project Mybatis-PageHelper by pagehelper.

the class SqlServerParser method addRowNumber.

/**
 * 获取 ROW_NUMBER() 列
 *
 * @param plainSelect 原查询
 * @param autoItems   自动生成的查询列
 * @return ROW_NUMBER() 列
 */
protected SelectItem addRowNumber(PlainSelect plainSelect, List<SelectItem> autoItems) {
    // 增加ROW_NUMBER()
    StringBuilder orderByBuilder = new StringBuilder();
    orderByBuilder.append("ROW_NUMBER() OVER (");
    if (isNotEmptyList(plainSelect.getOrderByElements())) {
        orderByBuilder.append(PlainSelect.orderByToString(getOrderByElements(plainSelect, autoItems)).substring(1));
        // 清空排序列表
        plainSelect.setOrderByElements(null);
    } else {
        orderByBuilder.append("ORDER BY RAND()");
    }
    orderByBuilder.append(") ");
    orderByBuilder.append(PAGE_ROW_NUMBER);
    return new SelectExpressionItem(new Column(orderByBuilder.toString()));
}
Also used : Column(net.sf.jsqlparser.schema.Column)

Example 14 with Column

use of net.sf.jsqlparser.schema.Column in project Mybatis-PageHelper by pagehelper.

the class SqlServerParser method getOrderByElements.

/**
 * 获取新的排序列表
 *
 * @param plainSelect 原始查询
 * @param autoItems   生成的新查询要素
 * @return 新的排序列表
 */
protected List<OrderByElement> getOrderByElements(PlainSelect plainSelect, List<SelectItem> autoItems) {
    List<OrderByElement> orderByElements = plainSelect.getOrderByElements();
    ListIterator<OrderByElement> iterator = orderByElements.listIterator();
    OrderByElement orderByElement;
    // 非 `*` 且 非 `t.*` 查询列集合
    Map<String, SelectExpressionItem> selectMap = new HashMap<String, SelectExpressionItem>();
    // 别名集合
    Set<String> aliases = new HashSet<String>();
    // 是否包含 `*` 查询列
    boolean allColumns = false;
    // `t.*` 查询列的表名集合
    Set<String> allColumnsTables = new HashSet<String>();
    for (SelectItem item : plainSelect.getSelectItems()) {
        if (item instanceof SelectExpressionItem) {
            SelectExpressionItem expItem = (SelectExpressionItem) item;
            selectMap.put(expItem.getExpression().toString(), expItem);
            Alias alias = expItem.getAlias();
            if (alias != null) {
                aliases.add(alias.getName());
            }
        } else if (item instanceof AllColumns) {
            allColumns = true;
        } else if (item instanceof AllTableColumns) {
            allColumnsTables.add(((AllTableColumns) item).getTable().getName());
        }
    }
    // 开始遍历 OrderByElement 列表
    int aliasNo = 1;
    while (iterator.hasNext()) {
        orderByElement = iterator.next();
        Expression expression = orderByElement.getExpression();
        SelectExpressionItem selectExpressionItem = selectMap.get(expression.toString());
        if (selectExpressionItem != null) {
            // OrderByElement 在查询列表中
            Alias alias = selectExpressionItem.getAlias();
            if (alias != null) {
                // 查询列含有别名时用查询列别名
                iterator.set(cloneOrderByElement(orderByElement, alias.getName()));
            } else {
                // 查询列不包含别名
                if (expression instanceof Column) {
                    // 查询列为普通列,这时因为列在嵌套查询外时名称中不包含表名,故去除排序列的表名引用
                    // 例(仅为解释此处逻辑,不代表最终分页结果):
                    // SELECT TEST.A FROM TEST ORDER BY TEST.A
                    // -->
                    // SELECT A FROM (SELECT TEST.A FROM TEST) ORDER BY A
                    ((Column) expression).setTable(null);
                } else {
                    // 而为列增加别名是非常简单的,故此要求排序复杂列必须使用别名
                    throw new PageException("列 \"" + expression + "\" 需要定义别名");
                }
            }
        } else {
            // OrderByElement 不在查询列表中,需要自动生成一个查询列
            if (expression instanceof Column) {
                // OrderByElement 为普通列
                Table table = ((Column) expression).getTable();
                if (table == null) {
                    // 表名为空
                    if (allColumns || (allColumnsTables.size() == 1 && plainSelect.getJoins() == null) || aliases.contains(((Column) expression).getColumnName())) {
                        // 此时排序列其实已经包含在查询列表中了,不需做任何操作
                        continue;
                    }
                } else {
                    // 表名不为空
                    String tableName = table.getName();
                    if (allColumns || allColumnsTables.contains(tableName)) {
                        // 包含`*`查询列 或者 包含特定的`t.*`列
                        // 此时排序列其实已经包含在查询列表中了,只需去除排序列的表名引
                        ((Column) expression).setTable(null);
                        continue;
                    }
                }
            }
            // 将排序列加入查询列中
            String aliasName = PAGE_COLUMN_ALIAS_PREFIX + aliasNo++;
            SelectExpressionItem item = new SelectExpressionItem();
            item.setExpression(expression);
            item.setAlias(new Alias(aliasName));
            autoItems.add(item);
            iterator.set(cloneOrderByElement(orderByElement, aliasName));
        }
    }
    return orderByElements;
}
Also used : PageException(com.github.pagehelper.PageException) Table(net.sf.jsqlparser.schema.Table) Expression(net.sf.jsqlparser.expression.Expression) Column(net.sf.jsqlparser.schema.Column) Alias(net.sf.jsqlparser.expression.Alias)

Example 15 with Column

use of net.sf.jsqlparser.schema.Column in project spanner-jdbc by olavloite.

the class CloudSpannerResultSetMetaData method isNullable.

@Override
public int isNullable(int column) throws SQLException {
    Column col = getColumn(column);
    if (col != null && col.getTable() != null) {
        String schema = Strings.isNullOrEmpty(col.getTable().getSchemaName()) ? "" : CloudSpannerDriver.unquoteIdentifier(col.getTable().getSchemaName());
        String tableName = CloudSpannerDriver.unquoteIdentifier(col.getTable().getName());
        String colName = CloudSpannerDriver.unquoteIdentifier(col.getColumnName());
        try (java.sql.ResultSet rs = statement.getConnection().getMetaData().getColumns("", schema, tableName, colName)) {
            if (rs.next()) {
                return rs.getInt("NULLABLE");
            }
        }
    }
    return columnNullableUnknown;
}
Also used : Column(net.sf.jsqlparser.schema.Column)

Aggregations

Column (net.sf.jsqlparser.schema.Column)43 Expression (net.sf.jsqlparser.expression.Expression)19 Test (org.junit.Test)19 Table (net.sf.jsqlparser.schema.Table)18 PlainSelect (net.sf.jsqlparser.statement.select.PlainSelect)18 Select (net.sf.jsqlparser.statement.select.Select)18 ArrayList (java.util.ArrayList)9 SelectExpressionItem (net.sf.jsqlparser.statement.select.SelectExpressionItem)8 SelectItem (net.sf.jsqlparser.statement.select.SelectItem)8 OrderByElement (net.sf.jsqlparser.statement.select.OrderByElement)6 LongValue (net.sf.jsqlparser.expression.LongValue)5 AndExpression (net.sf.jsqlparser.expression.operators.conditional.AndExpression)5 Statement (net.sf.jsqlparser.statement.Statement)5 SelectBody (net.sf.jsqlparser.statement.select.SelectBody)5 SimpleNode (net.sf.jsqlparser.parser.SimpleNode)4 SelectVisitorAdapter (net.sf.jsqlparser.statement.select.SelectVisitorAdapter)4 WriteBuilder (com.google.cloud.spanner.Mutation.WriteBuilder)3 ExpressionVisitorAdapter (net.sf.jsqlparser.expression.ExpressionVisitorAdapter)3 CloudSpannerSQLException (nl.topicus.jdbc.exception.CloudSpannerSQLException)3 SQLException (java.sql.SQLException)2