use of com.servoy.j2db.persistence.Column in project servoy-client by Servoy.
the class SQLGenerator method addSorts.
public void addSorts(QuerySelect sqlSelect, BaseQueryTable selectTable, IGlobalValueEntry provider, ITable table, List<SortColumn> orderByFields, boolean includeRelated, boolean permanentJoins) throws RepositoryException {
List<Column> unusedRowidentColumns = new ArrayList<Column>(table.getRowIdentColumns());
for (int i = 0; orderByFields != null && i < orderByFields.size(); i++) {
SortColumn sc = orderByFields.get(i);
// can be column or aggregate
IColumn column = sc.getColumn();
if (column.getDataProviderType() == MEDIA && (column.getFlags() & (IDENT_COLUMNS | UUID_COLUMN)) == 0) {
// skip cannot sort blob columns
continue;
}
SortOptions sortOptions = application.getFoundSetManager().getSortOptions(sc.getColumn());
Relation[] relations = sc.getRelations();
// compare on server objects, relation.foreignServerName may be different in case of duplicates
boolean doRelatedJoin = (includeRelated && relations != null);
if (doRelatedJoin) {
FlattenedSolution fs = application.getFlattenedSolution();
for (Relation relation : relations) {
if (relation.isMultiServer() && !fs.getTable(relation.getForeignDataSource()).getServerName().equals(table.getServerName())) {
doRelatedJoin = false;
break;
}
}
}
if (doRelatedJoin) // related sort, cannot join across multiple servers
{
BaseQueryTable primaryQtable = selectTable;
BaseQueryTable foreignQtable = null;
for (Relation relation : relations) {
// join must be re-created as it is possible to have globals involved;
// first remove, then create it
ISQLTableJoin join = (ISQLTableJoin) sqlSelect.getJoin(primaryQtable, relation.getName());
if (join != null)
sqlSelect.getJoins().remove(join);
if (join == null) {
ITable foreignTable = application.getFlattenedSolution().getTable(relation.getForeignDataSource());
foreignQtable = new QueryTable(foreignTable.getSQLName(), foreignTable.getDataSource(), foreignTable.getCatalog(), foreignTable.getSchema());
} else {
foreignQtable = join.getForeignTable();
}
sqlSelect.addJoin(createJoin(application.getFlattenedSolution(), relation, primaryQtable, foreignQtable, permanentJoins, provider));
primaryQtable = foreignQtable;
}
IQuerySelectValue queryColumn;
if (column instanceof Column) {
queryColumn = ((Column) column).queryColumn(foreignQtable);
unusedRowidentColumns.remove(column);
} else if (column instanceof AggregateVariable) {
AggregateVariable aggregate = (AggregateVariable) column;
queryColumn = new QueryAggregate(aggregate.getType(), new QueryColumn(foreignQtable, -1, aggregate.getColumnNameToAggregate(), aggregate.getDataProviderType(), aggregate.getLength(), 0, null, aggregate.getFlags()), aggregate.getName());
// there has to be a group-by clause for all selected fields
List<IQuerySelectValue> columns = sqlSelect.getColumns();
for (IQuerySelectValue selectVal : columns) {
List<IQuerySelectValue> groupBy = sqlSelect.getGroupBy();
if (selectVal instanceof QueryColumn && (groupBy == null || !groupBy.contains(selectVal))) {
sqlSelect.addGroupBy(selectVal);
}
}
// if the aggregate has not been selected yet, add it and skip it in the result
QueryAggregate skippedAggregate = new QueryAggregate(aggregate.getType(), QueryAggregate.ALL, new QueryColumn(foreignQtable, -1, aggregate.getColumnNameToAggregate(), aggregate.getDataProviderType(), aggregate.getLength(), 0, null, aggregate.getFlags()), aggregate.getName(), null, true);
if (!columns.contains(skippedAggregate)) {
sqlSelect.addColumn(skippedAggregate);
}
} else {
// $NON-NLS-1$
Debug.log("Skipping sort on unexpected related column type " + column.getClass());
continue;
}
sqlSelect.addSort(new QuerySort(queryColumn, sc.getSortOrder() == ASCENDING, sortOptions));
} else {
// make sure an invalid sort is not possible
if (column instanceof Column && column.getTable().getName().equals(table.getName())) {
sqlSelect.addSort(new QuerySort(((Column) column).queryColumn(selectTable), sc.getSortOrder() == ASCENDING, sortOptions));
unusedRowidentColumns.remove(column);
} else {
// $NON-NLS-1$ //$NON-NLS-2$
Debug.log("Skipping sort on unrelated column " + column.getName() + '.' + column.getTable().getName() + " for table " + table.getName());
}
}
}
// Make sure pk is part of the sort, in case of non-unique sort columns, the sorted result may not be the same in each fetch
if (enforcePkInSort) {
for (Column column : unusedRowidentColumns) {
SortOptions sortOptions = application.getFoundSetManager().getSortOptions(column);
sqlSelect.addSort(new QuerySort(column.queryColumn(selectTable), true, sortOptions));
}
}
}
use of com.servoy.j2db.persistence.Column in project servoy-client by Servoy.
the class SQLGenerator method createPKValuesArray.
static Object[][] createPKValuesArray(List<Column> pkColumns, IDataSet pks) {
Object[][] pkValues = new Object[pkColumns.size()][];
for (int k = 0; k < pkColumns.size(); k++) {
pkValues[k] = new Object[pks.getRowCount()];
}
for (int r = 0; r < pks.getRowCount(); r++) {
Object[] row = pks.getRow(r);
for (int k = 0; k < row.length; k++) {
Column c = pkColumns.get(k);
pkValues[k][r] = c.getAsRightType(row[k]);
}
}
return pkValues;
}
use of com.servoy.j2db.persistence.Column in project servoy-client by Servoy.
the class SQLGenerator method makeRelatedSQL.
synchronized void makeRelatedSQL(SQLSheet relatedSheet, Relation r) {
if (relatedSheet.getRelatedSQLDescription(r.getName()) != null)
return;
try {
FlattenedSolution fs = application.getFlattenedSolution();
if (!Relation.isValid(r, fs) || r.isParentRef()) {
return;
}
ITable ft = fs.getTable(r.getForeignDataSource());
if (ft == null) {
return;
}
// add primary keys if missing
QueryTable foreignQTable = new QueryTable(ft.getSQLName(), ft.getDataSource(), ft.getCatalog(), ft.getSchema());
QuerySelect relatedSelect = new QuerySelect(foreignQTable);
List<String> parentRequiredDataProviderIDs = new ArrayList<String>();
Column[] relcols = r.getForeignColumns(fs);
for (Column column : relcols) {
parentRequiredDataProviderIDs.add(column.getDataProviderID());
}
relatedSelect.setCondition(CONDITION_RELATION, createRelatedCondition(application, r, foreignQTable));
Collection<Column> rcolumns = ft.getColumns();
relatedSelect.setColumns(makeQueryColumns(rcolumns.iterator(), foreignQTable, null));
// fill dataprovider map
List<String> dataProviderIDsDilivery = new ArrayList<String>();
Iterator<Column> it = rcolumns.iterator();
while (it.hasNext()) {
Column col = it.next();
dataProviderIDsDilivery.add(col.getDataProviderID());
}
relatedSheet.addRelatedSelect(r.getName(), relatedSelect, dataProviderIDsDilivery, parentRequiredDataProviderIDs, null);
createAggregates(relatedSheet, foreignQTable);
} catch (RepositoryException e) {
Debug.error(e);
}
}
use of com.servoy.j2db.persistence.Column in project servoy-client by Servoy.
the class SQLGenerator method createUpdateLockSelect.
public static QuerySelect createUpdateLockSelect(Table table, Object[][] pkValues, boolean lockInDb) {
QuerySelect lockSelect = new QuerySelect(new QueryTable(table.getSQLName(), table.getDataSource(), table.getCatalog(), table.getSchema()));
if (lockInDb)
lockSelect.setLockMode(ISQLSelect.LOCK_MODE_LOCK_NOWAIT);
LinkedHashMap<Column, QueryColumn> allQueryColumns = new LinkedHashMap<>();
for (Column column : table.getColumns()) {
allQueryColumns.put(column, column.queryColumn(lockSelect.getTable()));
}
lockSelect.setColumns(new ArrayList<IQuerySelectValue>(allQueryColumns.values()));
// get the pk columns, make sure the order is in pk-order (alphabetical)
ArrayList<QueryColumn> pkQueryColumns = new ArrayList<>();
for (Column pkColumn : table.getRowIdentColumns()) {
pkQueryColumns.add(allQueryColumns.get(pkColumn));
}
// values is an array as wide as the columns, each element consists of the values for that column
Object[][] values = new Object[pkQueryColumns.size()][];
for (int k = 0; k < pkQueryColumns.size(); k++) {
values[k] = new Object[pkValues.length];
for (int r = 0; r < pkValues.length; r++) {
values[k][r] = pkValues[r][k];
}
}
lockSelect.setCondition(CONDITION_LOCK, new SetCondition(IBaseSQLCondition.EQUALS_OPERATOR, pkQueryColumns.toArray(new QueryColumn[pkQueryColumns.size()]), values, true));
return lockSelect;
}
use of com.servoy.j2db.persistence.Column in project servoy-client by Servoy.
the class SQLGenerator method createTableFiltercondition.
private static QueryFilter createTableFiltercondition(BaseQueryTable qTable, Table table, QuerySelect filterQuery) {
QuerySelect filterQueryClone = deepClone(filterQuery);
filterQueryClone.relinkTable(filterQueryClone.getTable(), qTable);
List<QueryColumn> pkColumns = table.getRowIdentColumns().stream().map(column -> column.queryColumn(qTable)).collect(toList());
return new QueryFilter(filterQueryClone.getJoins(), pkColumns, filterQueryClone.getWhere());
}
Aggregations