use of herddb.model.Column in project herddb by diennea.
the class CalcitePlanner method planEnumerableMergeJoin.
private PlannerOp planEnumerableMergeJoin(EnumerableMergeJoin op, RelDataType rowType) {
// please note that EnumerableMergeJoin has a condition field which actually is not useful
PlannerOp left = convertRelNode(op.getLeft(), null, false, false);
PlannerOp right = convertRelNode(op.getRight(), null, false, false);
final JoinInfo analyzeCondition = op.analyzeCondition();
int[] leftKeys = analyzeCondition.leftKeys.toIntArray();
int[] rightKeys = analyzeCondition.rightKeys.toIntArray();
boolean generateNullsOnLeft = op.getJoinType().generatesNullsOnLeft();
boolean generateNullsOnRight = op.getJoinType().generatesNullsOnRight();
final RelDataType _rowType = rowType == null ? op.getRowType() : rowType;
List<CompiledSQLExpression> nonEquiConditions = convertJoinNonEquiConditions(analyzeCondition);
List<RelDataTypeField> fieldList = _rowType.getFieldList();
Column[] columns = new Column[fieldList.size()];
String[] fieldNames = new String[columns.length];
int i = 0;
for (RelDataTypeField field : fieldList) {
Column col = Column.column(field.getName().toLowerCase(), convertToHerdType(field.getType()));
fieldNames[i] = col.name;
columns[i++] = col;
}
return new JoinOp(fieldNames, columns, leftKeys, left, rightKeys, right, generateNullsOnLeft, generateNullsOnRight, true, nonEquiConditions);
}
use of herddb.model.Column in project herddb by diennea.
the class CalcitePlanner method planEnumerableHashJoin.
private PlannerOp planEnumerableHashJoin(EnumerableHashJoin op, RelDataType rowType) {
// please note that EnumerableSemiJoin has a condition field which actually is not useful
PlannerOp left = convertRelNode(op.getLeft(), null, false, false);
PlannerOp right = convertRelNode(op.getRight(), null, false, false);
final JoinInfo analyzeCondition = op.analyzeCondition();
int[] leftKeys = analyzeCondition.leftKeys.toIntArray();
int[] rightKeys = analyzeCondition.rightKeys.toIntArray();
boolean generateNullsOnLeft = op.getJoinType().generatesNullsOnLeft();
boolean generateNullsOnRight = op.getJoinType().generatesNullsOnRight();
List<CompiledSQLExpression> nonEquiConditions = convertJoinNonEquiConditions(analyzeCondition);
final RelDataType _rowType = rowType == null ? op.getRowType() : rowType;
List<RelDataTypeField> fieldList = _rowType.getFieldList();
Column[] columns = new Column[fieldList.size()];
String[] fieldNames = new String[columns.length];
int i = 0;
for (RelDataTypeField field : fieldList) {
Column col = Column.column(field.getName().toLowerCase(), convertToHerdType(field.getType()));
fieldNames[i] = col.name;
columns[i++] = col;
}
if (op.isSemiJoin()) {
return new SemiJoinOp(fieldNames, columns, leftKeys, left, rightKeys, right);
} else {
return new JoinOp(fieldNames, columns, leftKeys, left, rightKeys, right, generateNullsOnLeft, generateNullsOnRight, false, nonEquiConditions);
}
}
use of herddb.model.Column in project herddb by diennea.
the class CalcitePlanner method planInsert.
private PlannerOp planInsert(EnumerableTableModify dml, boolean returnValues, boolean upsert) {
final String tableSpace = dml.getTable().getQualifiedName().get(0);
final String tableName = dml.getTable().getQualifiedName().get(1);
DMLStatement statement = null;
if (dml.getInput() instanceof EnumerableProject) {
// fastest path for insert into TABLE(s,b,c) values(?,?,?)
EnumerableProject project = (EnumerableProject) dml.getInput();
if (project.getInput() instanceof EnumerableValues) {
EnumerableValues values = (EnumerableValues) project.getInput();
if (values.getTuples().size() == 1) {
final TableImpl tableImpl = (TableImpl) dml.getTable().unwrap(org.apache.calcite.schema.Table.class);
Table table = tableImpl.tableManager.getTable();
int index = 0;
List<RexNode> projects = project.getProjects();
List<CompiledSQLExpression> keyValueExpression = new ArrayList<>();
List<String> keyExpressionToColumn = new ArrayList<>();
List<CompiledSQLExpression> valuesExpressions = new ArrayList<>();
List<String> valuesColumns = new ArrayList<>();
boolean invalid = false;
for (Column column : table.getColumns()) {
CompiledSQLExpression exp = SQLExpressionCompiler.compileExpression(projects.get(index));
if (exp instanceof ConstantExpression || exp instanceof JdbcParameterExpression || exp instanceof TypedJdbcParameterExpression) {
boolean isAlwaysNull = (exp instanceof ConstantExpression) && ((ConstantExpression) exp).isNull();
if (!isAlwaysNull) {
if (table.isPrimaryKeyColumn(column.name)) {
keyExpressionToColumn.add(column.name);
keyValueExpression.add(exp);
}
valuesColumns.add(column.name);
valuesExpressions.add(exp);
}
index++;
} else {
invalid = true;
break;
}
}
if (!invalid) {
RecordFunction keyfunction;
if (keyValueExpression.isEmpty() && table.auto_increment) {
keyfunction = new AutoIncrementPrimaryKeyRecordFunction();
} else {
if (keyValueExpression.size() != table.primaryKey.length) {
throw new StatementExecutionException("you must set a value for the primary key (expressions=" + keyValueExpression.size() + ")");
}
keyfunction = new SQLRecordKeyFunction(keyExpressionToColumn, keyValueExpression, table);
}
RecordFunction valuesfunction = new SQLRecordFunction(valuesColumns, table, valuesExpressions);
statement = new InsertStatement(tableSpace, tableName, keyfunction, valuesfunction, upsert).setReturnValues(returnValues);
}
}
}
}
if (statement != null) {
return new SimpleInsertOp(statement);
}
PlannerOp input = convertRelNode(dml.getInput(), null, false, false);
try {
return new InsertOp(tableSpace, tableName, input, returnValues, upsert);
} catch (IllegalArgumentException err) {
throw new StatementExecutionException(err);
}
}
use of herddb.model.Column in project herddb by diennea.
the class CalcitePlanner method planEnumerableTableScan.
private PlannerOp planEnumerableTableScan(EnumerableTableScan scan, RelDataType rowType) {
final String tableSpace = scan.getTable().getQualifiedName().get(0);
final TableImpl tableImpl = (TableImpl) scan.getTable().unwrap(org.apache.calcite.schema.Table.class);
Table table = tableImpl.tableManager.getTable();
Column[] columns = table.getColumns();
int numColumns = columns.length;
boolean usingAliases = false;
if (rowType != null) {
List<String> fieldNamesFromQuery = rowType.getFieldNames();
for (int i = 0; i < numColumns; i++) {
String fieldName = fieldNamesFromQuery.get(i);
String alias = fieldName.toLowerCase();
String colName = columns[i].name;
if (!alias.equals(colName)) {
usingAliases = true;
break;
}
}
}
if (usingAliases) {
List<String> fieldNamesFromQuery = rowType.getFieldNames();
String[] fieldNames = new String[numColumns];
int[] projections = new int[numColumns];
for (int i = 0; i < numColumns; i++) {
String alias = fieldNamesFromQuery.get(i).toLowerCase();
fieldNames[i] = alias;
projections[i] = i;
}
Projection zeroCopy = new ProjectOp.ZeroCopyProjection(fieldNames, columns, projections);
ScanStatement scanStatement = new ScanStatement(tableSpace, table, zeroCopy, null);
return new TableScanOp(scanStatement);
} else {
ScanStatement scanStatement = new ScanStatement(tableSpace, table, null);
return new TableScanOp(scanStatement);
}
}
use of herddb.model.Column in project herddb by diennea.
the class JSQLParserPlanner method planValuesForInsertOp.
private ValuesOp planValuesForInsertOp(List<net.sf.jsqlparser.schema.Column> fieldList, Table tableSchema, OpSchema insertSchema, List<ExpressionList> op) {
List<List<CompiledSQLExpression>> tuples = new ArrayList<>(op.size());
Column[] columns = new Column[tableSchema.columns.length];
int i = 0;
String[] fieldNames = new String[tableSchema.columns.length];
for (Column tableColumn : tableSchema.columns) {
columns[i] = tableColumn;
fieldNames[i++] = tableColumn.name;
}
for (ExpressionList tuple : op) {
List<CompiledSQLExpression> row = new ArrayList<>(tuple.getExpressions().size());
List<Expression> values = tuple.getExpressions();
// we must follow exactly the physical model of the table, see InsertOp
for (Column tableColumn : tableSchema.columns) {
int pos = 0;
CompiledSQLExpression exp = null;
for (net.sf.jsqlparser.schema.Column field : fieldList) {
if (fixMySqlBackTicks(field.getColumnName()).equalsIgnoreCase(tableColumn.name)) {
Expression corresponding = values.get(pos);
exp = SQLParserExpressionCompiler.compileExpression(corresponding, insertSchema);
break;
}
pos++;
}
if (exp == null) {
if (tableColumn.defaultValue == null && ColumnTypes.isNotNullDataType(tableColumn.type) && !tableSchema.auto_increment) {
throw new StatementExecutionException("Column '" + tableColumn.name + "' has no default value and does not allow NULLs");
}
// handle DEFAULT
exp = makeDefaultValue(tableColumn);
}
row.add(exp);
}
tuples.add(row);
}
return new ValuesOp(manager.getNodeId(), fieldNames, columns, tuples);
}
Aggregations