private boolean isNeededToAppendGeneratedKey() { return -1 == insertStatement.getGenerateKeyColumnIndex() && shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).isPresent(); }
private Optional<GeneratedKey> createGeneratedKey(final InsertStatement insertStatement) { String logicTableName = insertStatement.getTables().getSingleTableName(); Optional<TableRule> tableRule = shardingRule.findTableRule(logicTableName); if (!tableRule.isPresent()) { return Optional.absent(); } Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(logicTableName); if (!generateKeyColumn.isPresent()) { return Optional.absent(); } GeneratedKey result = new GeneratedKey(generateKeyColumn.get()); for (int i = 0; i < insertStatement.getInsertValues().getInsertValues().size(); i++) { result.getGeneratedKeys().add(shardingRule.generateKey(logicTableName)); } return Optional.of(result); }
private void removeGenerateKeyColumn(final InsertStatement insertStatement, final ShardingRule shardingRule, final int valueCount) { Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()); if (generateKeyColumn.isPresent() && valueCount < insertStatement.getColumns().size()) { List<ItemsToken> itemsTokens = insertStatement.getItemsTokens(); insertStatement.getColumns().remove(new Column(generateKeyColumn.get().getName(), insertStatement.getTables().getSingleTableName())); for (ItemsToken each : itemsTokens) { each.getItems().remove(generateKeyColumn.get().getName()); insertStatement.setGenerateKeyColumnIndex(-1); } } }
private void removeGenerateKeyColumn(final InsertStatement insertStatement, final int valueCount) { Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()); if (generateKeyColumn.isPresent() && valueCount < insertStatement.getColumns().size()) { List<ItemsToken> itemsTokens = insertStatement.getItemsTokens(); insertStatement.getColumns().remove(new Column(generateKeyColumn.get().getName(), insertStatement.getTables().getSingleTableName())); for (ItemsToken each : itemsTokens) { each.getItems().remove(generateKeyColumn.get().getName()); insertStatement.setGenerateKeyColumnIndex(-1); } } }
private InsertShardingCondition getInsertShardingCondition(final Comparable<?> currentGeneratedKey, final InsertValue insertValue, final List<Object> currentParameters) { Column generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()).get(); String expression = getExpression(insertValue, currentGeneratedKey, generateKeyColumn, currentParameters); InsertShardingCondition result = new InsertShardingCondition(expression, currentParameters); result.getShardingValues().add(getShardingCondition(generateKeyColumn, currentGeneratedKey)); insertStatement.setContainGenerateKey(true); return result; }
/** * Parse insert columns. * * @param insertStatement insert statement * @param shardingTableMetaData sharding table meta data */ public void parse(final InsertStatement insertStatement, final ShardingTableMetaData shardingTableMetaData) { String tableName = insertStatement.getTables().getSingleTableName(); Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName); insertStatement.getColumns().addAll(lexerEngine.equalAny(Symbol.LEFT_PAREN) ? parseWithColumn(insertStatement, tableName, generateKeyColumn) : parseWithoutColumn(insertStatement, shardingTableMetaData, tableName, generateKeyColumn)); }
private void processGeneratedKey(final InsertStatement insertStatement) { String tableName = insertStatement.getTables().getSingleTableName(); Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName); if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumn.isPresent()) { return; } if (DefaultKeyword.VALUES.equals(insertStatement.getInsertValues().getInsertValues().get(0).getType())) { if (!insertStatement.getItemsTokens().isEmpty()) { insertStatement.getItemsTokens().get(0).getItems().add(generateKeyColumn.get().getName()); } else { ItemsToken columnsToken = new ItemsToken(insertStatement.getColumnsListLastIndex()); columnsToken.getItems().add(generateKeyColumn.get().getName()); insertStatement.addSQLToken(columnsToken); } } } }
private void processGeneratedKey(final ShardingRule shardingRule, final InsertStatement insertStatement) { String tableName = insertStatement.getTables().getSingleTableName(); Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName); if (-1 != insertStatement.getGenerateKeyColumnIndex() || !generateKeyColumn.isPresent()) { return; } if (DefaultKeyword.VALUES.equals(insertStatement.getInsertValues().getInsertValues().get(0).getType())) { if (!insertStatement.getItemsTokens().isEmpty()) { insertStatement.getItemsTokens().get(0).getItems().add(generateKeyColumn.get().getName()); } else { ItemsToken columnsToken = new ItemsToken(insertStatement.getColumnsListLastIndex()); columnsToken.getItems().add(generateKeyColumn.get().getName()); insertStatement.addSQLToken(columnsToken); } } }
private void createColumn(final InsertSegment sqlSegment, final InsertStatement insertStatement, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) { if (sqlSegment.getColumns().isEmpty()) { createFromMeta(insertStatement, sqlSegment, shardingRule, shardingTableMetaData); return; } String tableName = insertStatement.getTables().getSingleTableName(); int index = 0; Optional<Column> shardingColumn = shardingRule.findGenerateKeyColumn(tableName); for (ColumnSegment each : sqlSegment.getColumns()) { Column column = new Column(each.getName(), tableName); insertStatement.getColumns().add(column); if (shardingColumn.isPresent() && shardingColumn.get().getName().equalsIgnoreCase(each.getName())) { insertStatement.setGenerateKeyColumnIndex(index); } if (each.getOwner().isPresent() && tableName.equals(each.getOwner().get())) { insertStatement.getSQLTokens().add(new TableToken(each.getStartIndex(), 0, SQLUtil.getExactlyValue(tableName), SQLUtil.getLeftDelimiter(tableName), SQLUtil.getRightDelimiter(tableName))); } index++; } }
private void createFromMeta(final InsertStatement insertStatement, final InsertSegment sqlSegment, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) { int count = 0; String tableName = insertStatement.getTables().getSingleTableName(); int startIndex = sqlSegment.getColumnClauseStartIndex(); insertStatement.addSQLToken(new InsertColumnToken(startIndex, "(")); ItemsToken columnsToken = new ItemsToken(startIndex); columnsToken.setFirstOfItemsSpecial(true); if (shardingTableMetaData.containsTable(tableName)) { Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(insertStatement.getTables().getSingleTableName()); for (String each : shardingTableMetaData.getAllColumnNames(tableName)) { if (generateKeyColumn.isPresent() && generateKeyColumn.get().getName().equalsIgnoreCase(each)) { insertStatement.setGenerateKeyColumnIndex(count); } Column column = new Column(each, tableName); insertStatement.getColumns().add(column); columnsToken.getItems().add(each); count++; } } insertStatement.addSQLToken(columnsToken); insertStatement.addSQLToken(new InsertColumnToken(startIndex, ")")); insertStatement.setColumnsListLastIndex(startIndex); }
insertStatement.addSQLToken(new InsertValuesToken(beginPosition, insertStatement.getTables().getSingleTableName())); String tableName = insertStatement.getTables().getSingleTableName(); Optional<Column> generateKeyColumn = shardingRule.findGenerateKeyColumn(tableName); int count = 0; do {