use of com.servoy.j2db.query.Placeholder in project servoy-client by Servoy.
the class FlattenedSolution method getValuelistSortRelation.
/**
* Get the internal relation that can be used to sort on this value list using the display values.
* @param valueList
* @param callingTable
* @param dataProviderID
* @param foundSetManager
* @return
* @throws RepositoryException
*/
public Relation getValuelistSortRelation(ValueList valueList, Table callingTable, String dataProviderID, IFoundSetManagerInternal foundSetManager) throws RepositoryException {
if (callingTable == null || valueList == null) {
return null;
}
String destDataSource;
Relation[] relationSequence;
String relationPrefix;
switch(valueList.getDatabaseValuesType()) {
case IValueListConstants.TABLE_VALUES:
// create an internal relation
relationSequence = null;
// $NON-NLS-1$
relationPrefix = "";
destDataSource = valueList.getDataSource();
break;
case IValueListConstants.RELATED_VALUES:
// replace the last relation in the sequence with an internal relation
relationSequence = getRelationSequence(valueList.getRelationName());
if (relationSequence == null) {
return null;
}
if (relationSequence.length > 1) {
for (Relation r : relationSequence) {
if (r.getJoinType() != INNER_JOIN) {
// outer join on the intermediate tables causes extra results that influence the sorting result
return null;
}
}
}
StringBuilder sb = new StringBuilder();
for (Relation r : relationSequence) {
sb.append('-').append(r.getName());
}
relationPrefix = sb.toString();
destDataSource = relationSequence[relationSequence.length - 1].getForeignDataSource();
break;
default:
return null;
}
if (destDataSource == null || !DataSourceUtils.isSameServer(callingTable.getDataSource(), destDataSource)) {
// do not create a cross-server relation
return null;
}
Table destTable = (Table) foundSetManager.getTable(destDataSource);
if (destTable == null) {
return null;
}
String relationName = // $NON-NLS-1$
Relation.INTERNAL_PREFIX + "VL-" + callingTable.getDataSource() + '-' + dataProviderID + relationPrefix + '-' + valueList.getName() + '-';
synchronized (this) {
Column callingColumn = callingTable.getColumn(dataProviderID);
if (callingColumn == null) {
return null;
}
Relation relation = getRelation(relationName);
if (relation == null) {
// create in internal relation
String dp;
int returnValues = valueList.getReturnDataProviders();
if ((returnValues & 1) != 0) {
dp = valueList.getDataProviderID1();
} else if ((returnValues & 2) != 0) {
dp = valueList.getDataProviderID2();
} else if ((returnValues & 4) != 0) {
dp = valueList.getDataProviderID3();
} else {
return null;
}
Column destColumn = destTable.getColumn(dp);
if (destColumn == null) {
return null;
}
// create internal value list relation
QueryTable callingQTable = new QueryTable(callingTable.getSQLName(), callingTable.getDataSource(), callingTable.getCatalog(), callingTable.getSchema());
QueryTable destQTable = new QueryTable(destTable.getSQLName(), destTable.getDataSource(), destTable.getCatalog(), destTable.getSchema());
List<ISQLTableJoin> joins = new ArrayList<ISQLTableJoin>();
ISQLTableJoin lastJoin = null;
if (relationSequence == null) {
// table values
joins.add(lastJoin = new QueryJoin(relationName, callingQTable, destQTable, new AndCondition(), LEFT_OUTER_JOIN, false));
if (// apply name as filter on column valuelist_name
valueList.getUseTableFilter()) {
lastJoin.getCondition().addCondition(new CompareCondition(IBaseSQLCondition.EQUALS_OPERATOR, new QueryColumn(destQTable, DBValueList.NAME_COLUMN), valueList.getName()));
}
} else {
// related values
QueryTable primaryQTable = callingQTable;
for (int i = 0; i < relationSequence.length; i++) {
Relation r = relationSequence[i];
QueryTable foreignQTable;
if (i == relationSequence.length - 1) {
// last one
foreignQTable = destQTable;
} else {
ITable relForeignTable = getTable(r.getForeignDataSource());
if (relForeignTable == null) {
return null;
}
foreignQTable = new QueryTable(relForeignTable.getSQLName(), relForeignTable.getDataSource(), relForeignTable.getCatalog(), relForeignTable.getSchema());
}
lastJoin = SQLGenerator.createJoin(this, r, primaryQTable, foreignQTable, false, new IGlobalValueEntry() {
public Object setDataProviderValue(String dpid, Object value) {
return null;
}
public Object getDataProviderValue(String dpid) {
// A value will be added when the relation is used, see SQLGenerator.createJoin
return new Placeholder(new ObjectPlaceholderKey<int[]>(null, dpid));
}
public boolean containsDataProvider(String dpid) {
return false;
}
});
joins.add(lastJoin);
primaryQTable = foreignQTable;
}
}
// add condition for return dp id
lastJoin.getCondition().addCondition(new CompareCondition(IBaseSQLCondition.EQUALS_OPERATOR, destColumn.queryColumn(destQTable), callingColumn.queryColumn(callingQTable)));
relation = getSolutionCopy().createNewRelation(new ScriptNameValidator(this), relationName, callingTable.getDataSource(), destDataSource, LEFT_OUTER_JOIN);
ISQLTableJoin join;
if (joins.size() == 1) {
join = lastJoin;
} else {
// combine joins
join = new QueryCompositeJoin(relationName, joins);
}
relation.setRuntimeProperty(Relation.RELATION_JOIN, join);
}
return relation;
}
}
use of com.servoy.j2db.query.Placeholder in project servoy-client by Servoy.
the class QBSelect method createOperand.
IQuerySelectValue createOperand(Object value, BaseColumnType columnType, int flags) {
if (value instanceof QBColumn) {
return ((QBColumn) value).getQuerySelectValue();
}
Object val = value;
if (value instanceof QBParameter) {
TablePlaceholderKey key = ((QBParameter) value).getPlaceholderKey();
Placeholder placeholder = null;
if (query != null) {
placeholder = query.getPlaceholder(key);
}
val = placeholder == null ? new Placeholder(key) : placeholder;
} else if (columnType == null) {
if (value instanceof Date && !(value instanceof Timestamp) && !(value instanceof Time)) {
// make sure a date is a timestamp
val = new Timestamp(((Date) value).getTime());
}
} else if (!(value instanceof IQuerySelectValue)) {
// convert the value (especially UUID) to the type of the column
val = getAsRightType(value, columnType, flags);
}
if (val instanceof IQuerySelectValue) {
return (IQuerySelectValue) val;
}
return new QueryColumnValue(val, null);
}
use of com.servoy.j2db.query.Placeholder in project servoy-client by Servoy.
the class SQLGenerator method makeQueryColumns.
private static ArrayList<IQuerySelectValue> makeQueryColumns(Iterator<Column> it, QueryTable queryTable, QueryInsert insert) {
ArrayList<IQuerySelectValue> queryColumns = new ArrayList<IQuerySelectValue>();
List<QueryColumn> insertColumns = new ArrayList<QueryColumn>();
while (it.hasNext()) {
Column column = it.next();
ColumnInfo ci = column.getColumnInfo();
if (ci != null && ci.isExcluded()) {
continue;
}
QueryColumn queryColumn = column.queryColumn(queryTable);
if (isBlobColumn(column)) {
String alias = column.getDataProviderID().substring(0, Math.min(Column.MAX_SQL_OBJECT_NAME_LENGTH - (IDataServer.BLOB_MARKER_COLUMN_ALIAS.length() + 1), column.getDataProviderID().length())) + '_' + IDataServer.BLOB_MARKER_COLUMN_ALIAS;
// make sure the alias is unique (2 media columns starting with the same name may clash here)
char c = 'a';
for (int i = 0; i < queryColumns.size(); i++) {
IQuerySelectValue sv = queryColumns.get(i);
if (alias.equals(sv.getAlias())) {
// alias not unique, replace first char to make it unique
alias = (c++) + alias.substring(1);
// search again
i = 0;
}
}
queryColumns.add(new QueryColumnValue(Integer.valueOf(1), alias, true));
} else {
queryColumns.add(queryColumn);
}
if (insert != null && (ci == null || !ci.isDBManaged())) {
insertColumns.add(queryColumn);
}
}
if (insert != null) {
insert.setColumnValues(insertColumns.toArray(new QueryColumn[insertColumns.size()]), new Placeholder(new TablePlaceholderKey(queryTable, PLACEHOLDER_INSERT_KEY)));
}
return queryColumns;
}
use of com.servoy.j2db.query.Placeholder in project servoy-client by Servoy.
the class SQLGenerator method createDynamicPKSetConditionForFoundset.
static SetCondition createDynamicPKSetConditionForFoundset(FoundSet foundSet, BaseQueryTable queryTable, IDataSet pks) {
Table table = (Table) foundSet.getTable();
List<Column> rowIdentColumns = table.getRowIdentColumns();
QueryColumn[] pkQueryColumns = new QueryColumn[rowIdentColumns.size()];
// getPrimaryKeys from table
for (int i = 0; i < rowIdentColumns.size(); i++) {
Column column = rowIdentColumns.get(i);
pkQueryColumns[i] = column.queryColumn(queryTable);
}
// Dynamic PK condition, the special placeholder will be updated when the foundset pk set changes
Placeholder placeHolder = new Placeholder(new TablePlaceholderKey(queryTable, SQLGenerator.PLACEHOLDER_FOUNDSET_PKS));
placeHolder.setValue(new DynamicPkValuesArray(rowIdentColumns, pks.clone()));
return new SetCondition(IBaseSQLCondition.EQUALS_OPERATOR, pkQueryColumns, placeHolder, true);
}
use of com.servoy.j2db.query.Placeholder in project servoy-client by Servoy.
the class SQLGenerator method isDynamicPKSetCondition.
static boolean isDynamicPKSetCondition(ISQLCondition condition) {
if (condition instanceof SetCondition) {
Object values = ((SetCondition) condition).getValues();
if (!(values instanceof Placeholder)) {
return false;
}
IPlaceholderKey key = ((Placeholder) values).getKey();
if (!(key instanceof TablePlaceholderKey)) {
return false;
}
if (!SQLGenerator.PLACEHOLDER_FOUNDSET_PKS.equals(((TablePlaceholderKey) key).getName())) {
return false;
}
return true;
}
return false;
}
Aggregations