Search in sources :

Example 1 with IPair

use of org.adempiere.util.lang.IPair in project metasfresh-webui-api by metasfresh.

the class WEBUI_SalesOrder_Apply_Availability_Row method extractLineRow2availabilityRows.

private Multimap<PurchaseRow, PurchaseRow> extractLineRow2availabilityRows() {
    final PurchaseView view = getView();
    final ListMultimap<PurchaseRow, PurchaseRow> lineRow2AvailabilityRows = getSelectedRowIds().stream().map(// map to PurchaseRowIds
    PurchaseRowId::fromDocumentId).filter(PurchaseRowId::isAvailabilityRowId).filter(availabilityRowId -> availabilityRowId.getAvailabilityType().equals(Type.AVAILABLE)).map(availabilityRowId -> // map to pair (availabilityRowId, availabilityRow)
    ImmutablePair.of(availabilityRowId, view.getById(availabilityRowId.toDocumentId()))).filter(availabilityRowId2row -> Util.coalesce(availabilityRowId2row.getRight().getQtyToPurchase(), BigDecimal.ZERO).signum() > 0).map(availabilityRowId2row -> // map to pair (lineRow, availabilityRow)
    ImmutablePair.of(view.getById(availabilityRowId2row.getLeft().toLineRowId().toDocumentId()), availabilityRowId2row.getRight())).filter(lineRow2availabilityRow -> !lineRow2availabilityRow.getLeft().isProcessed()).collect(Multimaps.toMultimap(IPair::getLeft, IPair::getRight, MultimapBuilder.hashKeys().arrayListValues()::build));
    return ImmutableMultimap.copyOf(lineRow2AvailabilityRows);
}
Also used : ViewBasedProcessTemplate(de.metas.ui.web.process.adprocess.ViewBasedProcessTemplate) IPair(org.adempiere.util.lang.IPair) Util(org.compiere.util.Util) Type(de.metas.purchasecandidate.availability.AvailabilityResult.Type) ListMultimap(com.google.common.collect.ListMultimap) PurchaseRowId(de.metas.ui.web.order.sales.purchasePlanning.view.PurchaseRowId) MultimapBuilder(com.google.common.collect.MultimapBuilder) NonNull(lombok.NonNull) DocumentId(de.metas.ui.web.window.datatypes.DocumentId) Set(java.util.Set) Multimap(com.google.common.collect.Multimap) Multimaps(com.google.common.collect.Multimaps) HashSet(java.util.HashSet) ProcessPreconditionsResolution(de.metas.process.ProcessPreconditionsResolution) BigDecimal(java.math.BigDecimal) ImmutablePair(org.adempiere.util.lang.ImmutablePair) Check(org.adempiere.util.Check) PurchaseView(de.metas.ui.web.order.sales.purchasePlanning.view.PurchaseView) Entry(java.util.Map.Entry) ViewChangesCollector(de.metas.ui.web.view.event.ViewChangesCollector) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) PurchaseRow(de.metas.ui.web.order.sales.purchasePlanning.view.PurchaseRow) IProcessPrecondition(de.metas.process.IProcessPrecondition) DocumentIdsSelection(de.metas.ui.web.window.datatypes.DocumentIdsSelection) PurchaseRow(de.metas.ui.web.order.sales.purchasePlanning.view.PurchaseRow) PurchaseView(de.metas.ui.web.order.sales.purchasePlanning.view.PurchaseView) PurchaseRowId(de.metas.ui.web.order.sales.purchasePlanning.view.PurchaseRowId)

Example 2 with IPair

use of org.adempiere.util.lang.IPair in project metasfresh-webui-api by metasfresh.

the class SqlDocumentQueryBuilder method buildSqlWhereClause.

private IPair<IStringExpression, List<Object>> buildSqlWhereClause() {
    final SqlParamsCollector sqlParams = SqlParamsCollector.newInstance();
    final CompositeStringExpression.Builder sqlWhereClauseBuilder = IStringExpression.composer();
    // 
    // Entity's WHERE clause
    {
        final IStringExpression entityWhereClauseExpression = entityBinding.getSqlWhereClause();
        if (!entityWhereClauseExpression.isNullExpression()) {
            sqlWhereClauseBuilder.appendIfNotEmpty("\n AND ");
            sqlWhereClauseBuilder.append(" /* entity where clause */ (").append(entityWhereClauseExpression).append(")");
        }
    }
    // 
    // Key column
    // FIXME: handle AD_Reference/AD_Ref_List(s). In that case the recordId will be AD_Ref_List.Value,
    // so the SQL where clause which is currently build is AD_Ref_List_ID=<the AD_Ref_List.Value>.
    // The build SQL where clause shall be something like AD_Reference_ID=<the reference, i think we shall fetch it somehow from Lookup> AND Value=<the value, which currently is the recordId>
    final DocumentId recordId = getRecordId();
    if (recordId != null) {
        final List<SqlDocumentFieldDataBindingDescriptor> keyFields = entityBinding.getKeyFields();
        if (keyFields.isEmpty()) {
            throw new AdempiereException("Failed building where clause because there is no Key Column defined in " + entityBinding);
        } else // Single primary key
        if (keyFields.size() == 1) {
            final String keyColumnName = keyFields.get(0).getColumnName();
            sqlWhereClauseBuilder.appendIfNotEmpty("\n AND ");
            sqlWhereClauseBuilder.append(" /* key */ ").append(keyColumnName).append("=").append(sqlParams.placeholder(recordId.toInt()));
        } else // Composed primary key
        {
            final Map<String, Object> keyColumnName2value = extractComposedKey(recordId, keyFields);
            keyColumnName2value.forEach((keyColumnName, value) -> {
                sqlWhereClauseBuilder.appendIfNotEmpty("\n AND ");
                sqlWhereClauseBuilder.append(" /* key */ ").append(keyColumnName).append("=").append(sqlParams.placeholder(value));
            });
        }
    }
    // 
    // Parent link where clause (if any)
    final Document parentDocument = getParentDocument();
    if (parentDocument != null) {
        final String parentLinkColumnName = entityBinding.getParentLinkColumnName();
        final String linkColumnName = entityBinding.getLinkColumnName();
        if (parentLinkColumnName != null && linkColumnName != null) {
            final IDocumentFieldView parentLinkField = parentDocument.getFieldView(parentLinkColumnName);
            final Object parentLinkValue = parentLinkField.getValue();
            final DocumentFieldWidgetType parentLinkWidgetType = parentLinkField.getWidgetType();
            final Class<?> targetClass = entityBinding.getFieldByFieldName(linkColumnName).getSqlValueClass();
            final Object sqlParentLinkValue = SqlDocumentsRepository.convertValueToPO(parentLinkValue, parentLinkColumnName, parentLinkWidgetType, targetClass);
            sqlWhereClauseBuilder.appendIfNotEmpty("\n AND ");
            sqlWhereClauseBuilder.append(" /* parent link */ ").append(linkColumnName).append("=").append(sqlParams.placeholder(sqlParentLinkValue));
        }
    }
    // 
    // Document filters
    {
        final String sqlFilters = SqlDocumentFilterConverters.createEntityBindingEffectiveConverter(entityBinding).getSql(sqlParams, getDocumentFilters(), SqlOptions.usingTableAlias(entityBinding.getTableAlias()));
        if (!Check.isEmpty(sqlFilters, true)) {
            sqlWhereClauseBuilder.appendIfNotEmpty("\n AND ");
            sqlWhereClauseBuilder.append(" /* filters */ (\n").append(sqlFilters).append(")\n");
        }
    }
    // Build the final SQL where clause
    return ImmutablePair.of(sqlWhereClauseBuilder.build(), Collections.unmodifiableList(sqlParams.toList()));
}
Also used : IPair(org.adempiere.util.lang.IPair) SqlDocumentFieldDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentFieldDataBindingDescriptor) DocumentId(de.metas.ui.web.window.datatypes.DocumentId) Env(org.compiere.util.Env) ArrayList(java.util.ArrayList) IStringExpression(org.adempiere.ad.expression.api.IStringExpression) Evaluatee(org.compiere.util.Evaluatee) SqlDocumentFilterConverters(de.metas.ui.web.document.filter.sql.SqlDocumentFilterConverters) ImmutableList(com.google.common.collect.ImmutableList) SqlEntityFieldBinding(de.metas.ui.web.window.descriptor.sql.SqlEntityFieldBinding) SqlDocumentEntityDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentEntityDataBindingDescriptor) IDocumentFieldView(de.metas.ui.web.window.model.IDocumentFieldView) Map(java.util.Map) DocumentEntityDescriptor(de.metas.ui.web.window.descriptor.DocumentEntityDescriptor) DocumentFilter(de.metas.ui.web.document.filter.DocumentFilter) DocumentQueryOrderBy(de.metas.ui.web.window.model.DocumentQueryOrderBy) OnVariableNotFound(org.adempiere.ad.expression.api.IExpressionEvaluator.OnVariableNotFound) Properties(java.util.Properties) WindowConstants(de.metas.ui.web.window.WindowConstants) UserRolePermissionsKey(org.adempiere.ad.security.UserRolePermissionsKey) Evaluatees(org.compiere.util.Evaluatees) ImmutableMap(com.google.common.collect.ImmutableMap) AccessSqlStringExpression(org.adempiere.ad.security.impl.AccessSqlStringExpression) MoreObjects(com.google.common.base.MoreObjects) Objects(java.util.Objects) DocumentFieldDescriptor(de.metas.ui.web.window.descriptor.DocumentFieldDescriptor) List(java.util.List) ImmutablePair(org.adempiere.util.lang.ImmutablePair) AdempiereException(org.adempiere.exceptions.AdempiereException) Check(org.adempiere.util.Check) DocumentFieldWidgetType(de.metas.ui.web.window.descriptor.DocumentFieldWidgetType) DocumentQuery(de.metas.ui.web.window.model.DocumentQuery) LookupValueByIdSupplier(de.metas.ui.web.window.model.lookup.LookupValueByIdSupplier) SqlParamsCollector(de.metas.ui.web.document.filter.sql.SqlParamsCollector) Collections(java.util.Collections) Document(de.metas.ui.web.window.model.Document) CompositeStringExpression(org.adempiere.ad.expression.api.impl.CompositeStringExpression) CompositeStringExpression(org.adempiere.ad.expression.api.impl.CompositeStringExpression) DocumentId(de.metas.ui.web.window.datatypes.DocumentId) Document(de.metas.ui.web.window.model.Document) IDocumentFieldView(de.metas.ui.web.window.model.IDocumentFieldView) SqlDocumentFieldDataBindingDescriptor(de.metas.ui.web.window.descriptor.sql.SqlDocumentFieldDataBindingDescriptor) DocumentFieldWidgetType(de.metas.ui.web.window.descriptor.DocumentFieldWidgetType) AdempiereException(org.adempiere.exceptions.AdempiereException) IStringExpression(org.adempiere.ad.expression.api.IStringExpression) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) SqlParamsCollector(de.metas.ui.web.document.filter.sql.SqlParamsCollector)

Example 3 with IPair

use of org.adempiere.util.lang.IPair in project metasfresh-webui-api by metasfresh.

the class SqlDocumentQueryBuilder method buildSql.

private final IPair<IStringExpression, List<Object>> buildSql() {
    final List<Object> sqlParams = new ArrayList<>();
    final CompositeStringExpression.Builder sqlBuilder = IStringExpression.composer();
    // 
    // SELECT ... FROM ...
    sqlBuilder.append(getSqlSelectFrom());
    // NOTE: no need to add security here because it was already embedded in SqlSelectFrom
    // 
    // WHERE
    {
        final IPair<IStringExpression, List<Object>> sqlWhereClauseAndParams = getSqlWhereAndParams();
        final IStringExpression sqlWhereClause = sqlWhereClauseAndParams.getLeft();
        if (!sqlWhereClause.isNullExpression()) {
            sqlBuilder.append("\n WHERE ").append(sqlWhereClause);
            sqlParams.addAll(sqlWhereClauseAndParams.getRight());
        }
    }
    // ORDER BY
    if (isSorting()) {
        final IStringExpression sqlOrderBy = getSqlOrderByEffective();
        if (sqlOrderBy != null && !sqlOrderBy.isNullExpression()) {
            sqlBuilder.append("\n ORDER BY ").append(sqlOrderBy);
        }
    }
    // 
    // LIMIT/OFFSET
    {
        final int firstRow = getFirstRow();
        if (firstRow > 0) {
            sqlBuilder.append("\n OFFSET ?");
            sqlParams.add(firstRow);
        }
        final int pageLength = getPageLength();
        if (pageLength > 0) {
            sqlBuilder.append("\n LIMIT ?");
            sqlParams.add(pageLength);
        }
    }
    // 
    return ImmutablePair.of(sqlBuilder.build(), Collections.unmodifiableList(sqlParams));
}
Also used : CompositeStringExpression(org.adempiere.ad.expression.api.impl.CompositeStringExpression) ArrayList(java.util.ArrayList) IPair(org.adempiere.util.lang.IPair) IStringExpression(org.adempiere.ad.expression.api.IStringExpression)

Example 4 with IPair

use of org.adempiere.util.lang.IPair in project metasfresh-webui-api by metasfresh.

the class SqlDocumentQueryBuilder method getSqlSelectParentId.

/**
 * SQL to fetch the parent's ID based on given child document.
 *
 * @return SELECT KeyColumnName from ParentTableName WHERE ....
 */
public String getSqlSelectParentId(final List<Object> outSqlParams, final DocumentEntityDescriptor parentEntityDescriptor) {
    final String linkColumnName = entityBinding.getLinkColumnName();
    final String parentLinkColumnName = entityBinding.getParentLinkColumnName();
    if (parentLinkColumnName == null || linkColumnName == null) {
        throw new AdempiereException("Selecting parent ID is not possible because this entity does not have a parent link").setParameter("linkColumnName", linkColumnName).setParameter("parentLinkColumnName", parentLinkColumnName).setParameter("entityBinding", entityBinding);
    }
    // 
    // SELECT linkColumnName from current(child) tableName
    final List<Object> sqlSelectLinkColumnNameParams = new ArrayList<>();
    final CompositeStringExpression.Builder sqlSelectLinkColumnName = IStringExpression.composer();
    {
        final IPair<IStringExpression, List<Object>> sqlWhereAndParams = getSqlWhereAndParams();
        final IStringExpression sqlWhere = sqlWhereAndParams.getLeft();
        final List<Object> sqlWhereParams = sqlWhereAndParams.getRight();
        sqlSelectLinkColumnName.append("SELECT " + linkColumnName).append(// NOTE: we need table alias because the where clause is using it
        " FROM " + entityBinding.getTableName() + " " + entityBinding.getTableAlias()).append("\n WHERE ").append(sqlWhere);
        sqlSelectLinkColumnNameParams.addAll(sqlWhereParams);
    }
    // 
    // 
    final String parentKeyColumnName = extractSingleKeyColumnName(parentEntityDescriptor);
    if (Objects.equals(parentKeyColumnName, parentLinkColumnName)) {
        final Evaluatee evalCtx = getEvaluationContext();
        final String sql = sqlSelectLinkColumnName.build().evaluate(evalCtx, OnVariableNotFound.Fail);
        outSqlParams.addAll(sqlSelectLinkColumnNameParams);
        return sql;
    } else {
        final Evaluatee evalCtx = getEvaluationContext();
        final String sql = IStringExpression.composer().append("SELECT " + parentKeyColumnName + " FROM " + parentEntityDescriptor.getTableName()).append("\n WHERE " + parentLinkColumnName + " IN (").append(sqlSelectLinkColumnName).append(")").build().evaluate(evalCtx, OnVariableNotFound.Fail);
        outSqlParams.addAll(sqlSelectLinkColumnNameParams);
        return sql;
    }
}
Also used : AdempiereException(org.adempiere.exceptions.AdempiereException) CompositeStringExpression(org.adempiere.ad.expression.api.impl.CompositeStringExpression) ArrayList(java.util.ArrayList) IPair(org.adempiere.util.lang.IPair) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) IStringExpression(org.adempiere.ad.expression.api.IStringExpression) Evaluatee(org.compiere.util.Evaluatee)

Aggregations

IPair (org.adempiere.util.lang.IPair)4 ArrayList (java.util.ArrayList)3 IStringExpression (org.adempiere.ad.expression.api.IStringExpression)3 CompositeStringExpression (org.adempiere.ad.expression.api.impl.CompositeStringExpression)3 ImmutableList (com.google.common.collect.ImmutableList)2 DocumentId (de.metas.ui.web.window.datatypes.DocumentId)2 Check (org.adempiere.util.Check)2 ImmutablePair (org.adempiere.util.lang.ImmutablePair)2 MoreObjects (com.google.common.base.MoreObjects)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 ImmutableMultimap (com.google.common.collect.ImmutableMultimap)1 ListMultimap (com.google.common.collect.ListMultimap)1 Multimap (com.google.common.collect.Multimap)1 MultimapBuilder (com.google.common.collect.MultimapBuilder)1 Multimaps (com.google.common.collect.Multimaps)1 IProcessPrecondition (de.metas.process.IProcessPrecondition)1 ProcessPreconditionsResolution (de.metas.process.ProcessPreconditionsResolution)1 Type (de.metas.purchasecandidate.availability.AvailabilityResult.Type)1 DocumentFilter (de.metas.ui.web.document.filter.DocumentFilter)1 SqlDocumentFilterConverters (de.metas.ui.web.document.filter.sql.SqlDocumentFilterConverters)1