Search in sources :

Example 16 with Column

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));
        }
    }
}
Also used : QueryAggregate(com.servoy.j2db.query.QueryAggregate) ArrayList(java.util.ArrayList) SafeArrayList(com.servoy.j2db.util.SafeArrayList) FlattenedSolution(com.servoy.j2db.FlattenedSolution) AggregateVariable(com.servoy.j2db.persistence.AggregateVariable) BaseQueryTable(com.servoy.base.query.BaseQueryTable) QueryTable(com.servoy.j2db.query.QueryTable) Relation(com.servoy.j2db.persistence.Relation) IRelation(com.servoy.j2db.persistence.IRelation) BaseQueryTable(com.servoy.base.query.BaseQueryTable) QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) IColumn(com.servoy.j2db.persistence.IColumn) Column(com.servoy.j2db.persistence.Column) IColumn(com.servoy.j2db.persistence.IColumn) ISQLTableJoin(com.servoy.j2db.query.ISQLTableJoin) QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) QuerySort(com.servoy.j2db.query.QuerySort) IQuerySort(com.servoy.j2db.query.IQuerySort) ITable(com.servoy.j2db.persistence.ITable) List(java.util.List) ArrayList(java.util.ArrayList) SafeArrayList(com.servoy.j2db.util.SafeArrayList) Collectors.toList(java.util.stream.Collectors.toList) SortOptions(com.servoy.j2db.query.SortOptions) IQuerySelectValue(com.servoy.j2db.query.IQuerySelectValue)

Example 17 with Column

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;
}
Also used : QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) IColumn(com.servoy.j2db.persistence.IColumn) Column(com.servoy.j2db.persistence.Column)

Example 18 with Column

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);
    }
}
Also used : QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) IColumn(com.servoy.j2db.persistence.IColumn) Column(com.servoy.j2db.persistence.Column) ArrayList(java.util.ArrayList) SafeArrayList(com.servoy.j2db.util.SafeArrayList) FlattenedSolution(com.servoy.j2db.FlattenedSolution) ITable(com.servoy.j2db.persistence.ITable) RepositoryException(com.servoy.j2db.persistence.RepositoryException) QuerySelect(com.servoy.j2db.query.QuerySelect) BaseQueryTable(com.servoy.base.query.BaseQueryTable) QueryTable(com.servoy.j2db.query.QueryTable)

Example 19 with Column

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;
}
Also used : ArrayList(java.util.ArrayList) SafeArrayList(com.servoy.j2db.util.SafeArrayList) SetCondition(com.servoy.j2db.query.SetCondition) QuerySelect(com.servoy.j2db.query.QuerySelect) BaseQueryTable(com.servoy.base.query.BaseQueryTable) QueryTable(com.servoy.j2db.query.QueryTable) LinkedHashMap(java.util.LinkedHashMap) QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) IColumn(com.servoy.j2db.persistence.IColumn) Column(com.servoy.j2db.persistence.Column) QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) IQuerySelectValue(com.servoy.j2db.query.IQuerySelectValue)

Example 20 with Column

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());
}
Also used : Array(java.lang.reflect.Array) QuerySort(com.servoy.j2db.query.QuerySort) QueryFunctionType.upper(com.servoy.j2db.query.QueryFunction.QueryFunctionType.upper) CompareCondition(com.servoy.j2db.query.CompareCondition) QueryColumn(com.servoy.j2db.query.QueryColumn) Debug(com.servoy.j2db.util.Debug) IQueryConstants(com.servoy.base.query.IQueryConstants) BaseQueryTable(com.servoy.base.query.BaseQueryTable) SetCondition(com.servoy.j2db.query.SetCondition) QueryTable(com.servoy.j2db.query.QueryTable) Utils(com.servoy.j2db.util.Utils) AbstractBase(com.servoy.j2db.persistence.AbstractBase) AggregateVariable(com.servoy.j2db.persistence.AggregateVariable) IServiceProvider(com.servoy.j2db.IServiceProvider) Map(java.util.Map) IBaseSQLCondition(com.servoy.base.query.IBaseSQLCondition) IPlaceholderKey(com.servoy.j2db.query.IPlaceholderKey) OrCondition(com.servoy.j2db.query.OrCondition) ISQLJoin(com.servoy.j2db.query.ISQLJoin) AbstractBaseQuery(com.servoy.j2db.query.AbstractBaseQuery) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) Collection(java.util.Collection) QueryDelete(com.servoy.j2db.query.QueryDelete) IDENT_COLUMNS(com.servoy.base.persistence.IBaseColumn.IDENT_COLUMNS) IVisitor(com.servoy.j2db.util.visitor.IVisitor) ConverterInfo(com.servoy.j2db.dataprocessing.SQLSheet.ConverterInfo) ISQLCondition(com.servoy.j2db.query.ISQLCondition) ITable(com.servoy.j2db.persistence.ITable) QueryFunction(com.servoy.j2db.query.QueryFunction) IDataProvider(com.servoy.j2db.persistence.IDataProvider) Table(com.servoy.j2db.persistence.Table) ParsedFormat(com.servoy.j2db.util.FormatParser.ParsedFormat) IApplication(com.servoy.j2db.IApplication) Wrapper(org.mozilla.javascript.Wrapper) ASCENDING(com.servoy.j2db.dataprocessing.SortColumn.ASCENDING) List(java.util.List) ColumnType(com.servoy.j2db.query.ColumnType) QueryColumnValue(com.servoy.j2db.query.QueryColumnValue) QueryJoin(com.servoy.j2db.query.QueryJoin) Types(java.sql.Types) IValueConverter(com.servoy.base.dataprocessing.IValueConverter) QueryInsert(com.servoy.j2db.query.QueryInsert) UUID_COLUMN(com.servoy.base.persistence.IBaseColumn.UUID_COLUMN) IQuerySort(com.servoy.j2db.query.IQuerySort) SortOptions(com.servoy.j2db.query.SortOptions) Placeholder(com.servoy.j2db.query.Placeholder) IDataProviderHandler(com.servoy.j2db.persistence.IDataProviderHandler) ScriptCalculation(com.servoy.j2db.persistence.ScriptCalculation) FlattenedSolution(com.servoy.j2db.FlattenedSolution) ObjectPlaceholderKey(com.servoy.j2db.query.ObjectPlaceholderKey) IQuerySelectValue(com.servoy.j2db.query.IQuerySelectValue) HashMap(java.util.HashMap) IColumn(com.servoy.j2db.persistence.IColumn) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) QueryFilter(com.servoy.j2db.query.QueryFilter) SafeArrayList(com.servoy.j2db.util.SafeArrayList) ISQLSelect(com.servoy.j2db.query.ISQLSelect) Relation(com.servoy.j2db.persistence.Relation) QueryFactory(com.servoy.j2db.query.QueryFactory) ServoyException(com.servoy.j2db.util.ServoyException) QueryCustomSelect(com.servoy.j2db.query.QueryCustomSelect) BaseColumnType(com.servoy.base.query.BaseColumnType) ITypeConverter(com.servoy.base.dataprocessing.ITypeConverter) QueryUpdate(com.servoy.j2db.query.QueryUpdate) RelatedFindState(com.servoy.j2db.dataprocessing.FindState.RelatedFindState) QueryAggregate(com.servoy.j2db.query.QueryAggregate) Iterator(java.util.Iterator) BaseSQLGenerator(com.servoy.base.dataprocessing.BaseSQLGenerator) IColumnTypes(com.servoy.j2db.persistence.IColumnTypes) Column.mapToDefaultType(com.servoy.j2db.persistence.Column.mapToDefaultType) ISQLTableJoin(com.servoy.j2db.query.ISQLTableJoin) ExistsCondition(com.servoy.j2db.query.ExistsCondition) QuerySelect(com.servoy.j2db.query.QuerySelect) AndCondition(com.servoy.j2db.query.AndCondition) Collectors.toList(java.util.stream.Collectors.toList) QueryFunctionType.castfrom(com.servoy.j2db.query.QueryFunction.QueryFunctionType.castfrom) IRelation(com.servoy.j2db.persistence.IRelation) ColumnInfo(com.servoy.j2db.persistence.ColumnInfo) LiteralDataprovider(com.servoy.j2db.persistence.LiteralDataprovider) QueryFunctionType.cast(com.servoy.j2db.query.QueryFunction.QueryFunctionType.cast) Column(com.servoy.j2db.persistence.Column) RelationItem(com.servoy.j2db.persistence.RelationItem) RepositoryException(com.servoy.j2db.persistence.RepositoryException) MEDIA(com.servoy.j2db.persistence.IColumnTypes.MEDIA) Collections(java.util.Collections) TablePlaceholderKey(com.servoy.j2db.query.TablePlaceholderKey) AbstractBaseQuery.deepClone(com.servoy.j2db.query.AbstractBaseQuery.deepClone) QueryFilter(com.servoy.j2db.query.QueryFilter) QueryColumn(com.servoy.j2db.query.QueryColumn) BaseQueryColumn(com.servoy.base.query.BaseQueryColumn) QuerySelect(com.servoy.j2db.query.QuerySelect)

Aggregations

Column (com.servoy.j2db.persistence.Column)76 QueryColumn (com.servoy.j2db.query.QueryColumn)44 IColumn (com.servoy.j2db.persistence.IColumn)37 RepositoryException (com.servoy.j2db.persistence.RepositoryException)32 IBaseColumn (com.servoy.base.persistence.IBaseColumn)31 QuerySelect (com.servoy.j2db.query.QuerySelect)29 ArrayList (java.util.ArrayList)29 QueryTable (com.servoy.j2db.query.QueryTable)27 ITable (com.servoy.j2db.persistence.ITable)23 BaseQueryTable (com.servoy.base.query.BaseQueryTable)22 Table (com.servoy.j2db.persistence.Table)22 ServoyException (com.servoy.j2db.util.ServoyException)21 SafeArrayList (com.servoy.j2db.util.SafeArrayList)19 IQuerySelectValue (com.servoy.j2db.query.IQuerySelectValue)18 RemoteException (java.rmi.RemoteException)17 ColumnInfo (com.servoy.j2db.persistence.ColumnInfo)16 BaseQueryColumn (com.servoy.base.query.BaseQueryColumn)14 IDataProvider (com.servoy.j2db.persistence.IDataProvider)12 Relation (com.servoy.j2db.persistence.Relation)12 Placeholder (com.servoy.j2db.query.Placeholder)12