diff --git a/src/main/java/de/metas/ui/web/view/DefaultView.java b/src/main/java/de/metas/ui/web/view/DefaultView.java index 70a41b692..f89a50975 100644 --- a/src/main/java/de/metas/ui/web/view/DefaultView.java +++ b/src/main/java/de/metas/ui/web/view/DefaultView.java @@ -74,7 +74,7 @@ public static final Builder builder(final IViewDataRepository viewDataRepository private final AtomicBoolean closed = new AtomicBoolean(false); private final ViewId parentViewId; - private final transient IViewRowIdsOrderedSelectionFactory orderedSelectionFactory; + // private final transient IViewRowIdsOrderedSelectionFactory orderedSelectionFactory; private final transient ViewRowIdsOrderedSelection defaultSelection; private final transient ConcurrentHashMap, ViewRowIdsOrderedSelection> selectionsByOrderBys = new ConcurrentHashMap<>(); @@ -109,7 +109,7 @@ private DefaultView(final Builder builder) // Selection { final ViewEvaluationCtx evalCtx = ViewEvaluationCtx.of(Env.getCtx()); - orderedSelectionFactory = viewDataRepository.createOrderedSelectionFactory(evalCtx); + // orderedSelectionFactory = viewDataRepository.createOrderedSelectionFactory(evalCtx); defaultSelection = viewDataRepository.createOrderedSelection( evalCtx // @@ -266,7 +266,7 @@ private ViewRowIdsOrderedSelection getOrderedSelection(final List orderedSelectionFactory.createFromView(defaultSelection, orderBysImmutable)); + return selectionsByOrderBys.computeIfAbsent(ImmutableList.copyOf(orderBys), orderBysImmutable -> viewDataRepository.createOrderedSelectionFromSelection(ViewEvaluationCtx.of(Env.getCtx()), defaultSelection, orderBysImmutable)); } @Override diff --git a/src/main/java/de/metas/ui/web/view/IViewDataRepository.java b/src/main/java/de/metas/ui/web/view/IViewDataRepository.java index 7a8293832..b8cbe5711 100644 --- a/src/main/java/de/metas/ui/web/view/IViewDataRepository.java +++ b/src/main/java/de/metas/ui/web/view/IViewDataRepository.java @@ -8,6 +8,7 @@ import de.metas.ui.web.window.datatypes.DocumentId; import de.metas.ui.web.window.datatypes.WindowId; import de.metas.ui.web.window.descriptor.filters.DocumentFilterDescriptorsProvider; +import de.metas.ui.web.window.model.DocumentQueryOrderBy; import de.metas.ui.web.window.model.filters.DocumentFilter; /* @@ -53,7 +54,7 @@ interface IViewDataRepository List retrieveModelsByIds(ViewId viewId, Collection rowIds, Class modelClass); - IViewRowIdsOrderedSelectionFactory createOrderedSelectionFactory(ViewEvaluationCtx viewEvalCtx); - ViewRowIdsOrderedSelection createOrderedSelection(ViewEvaluationCtx viewEvalCtx, WindowId windowId, List filters); + + ViewRowIdsOrderedSelection createOrderedSelectionFromSelection(final ViewEvaluationCtx viewEvalCtx, ViewRowIdsOrderedSelection fromSelection, List orderBys); } diff --git a/src/main/java/de/metas/ui/web/view/IViewRowIdsOrderedSelectionFactory.java b/src/main/java/de/metas/ui/web/view/IViewRowIdsOrderedSelectionFactory.java deleted file mode 100644 index 9e8871409..000000000 --- a/src/main/java/de/metas/ui/web/view/IViewRowIdsOrderedSelectionFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.metas.ui.web.view; - -import java.util.List; - -import de.metas.ui.web.window.model.DocumentQueryOrderBy; - -/* - * #%L - * metasfresh-webui-api - * %% - * Copyright (C) 2016 metas GmbH - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * . - * #L% - */ - -public interface IViewRowIdsOrderedSelectionFactory -{ - ViewRowIdsOrderedSelection createFromView(ViewRowIdsOrderedSelection fromView, List orderBys); -} diff --git a/src/main/java/de/metas/ui/web/view/SqlViewDataRepository.java b/src/main/java/de/metas/ui/web/view/SqlViewDataRepository.java index d8d4fad79..5a6ca1039 100644 --- a/src/main/java/de/metas/ui/web/view/SqlViewDataRepository.java +++ b/src/main/java/de/metas/ui/web/view/SqlViewDataRepository.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; import org.adempiere.ad.dao.IQueryBL; import org.adempiere.ad.dao.impl.TypedSqlQueryFilter; @@ -32,11 +31,12 @@ import de.metas.ui.web.view.descriptor.SqlViewBinding; import de.metas.ui.web.view.descriptor.SqlViewRowFieldBinding; import de.metas.ui.web.view.descriptor.SqlViewRowFieldBinding.SqlViewRowFieldLoader; -import de.metas.ui.web.view.descriptor.SqlViewRowIdsOrderedSelectionFactory; import de.metas.ui.web.window.datatypes.DocumentId; import de.metas.ui.web.window.datatypes.WindowId; import de.metas.ui.web.window.descriptor.filters.DocumentFilterDescriptorsProvider; +import de.metas.ui.web.window.model.DocumentQueryOrderBy; import de.metas.ui.web.window.model.filters.DocumentFilter; +import de.metas.ui.web.window.model.sql.SqlDocumentOrderByBuilder; import lombok.NonNull; /* @@ -90,14 +90,6 @@ public String getSqlWhereClause(final ViewId viewId, final Collection sqlOrderBysByFieldName = sqlBindings.getSqlOrderBysIndexedByFieldName(viewEvalCtx); - return new SqlViewRowIdsOrderedSelectionFactory(sqlCreateFromViewId, sqlOrderBysByFieldName); - } - @Override public ViewRowIdsOrderedSelection createOrderedSelection(final ViewEvaluationCtx viewEvalCtx, final WindowId windowId, final List filters) { @@ -129,6 +121,32 @@ public ViewRowIdsOrderedSelection createOrderedSelection(final ViewEvaluationCtx .build(); } + @Override + public ViewRowIdsOrderedSelection createOrderedSelectionFromSelection(final ViewEvaluationCtx viewEvalCtx, final ViewRowIdsOrderedSelection fromSelection, final List orderBys) + { + final WindowId windowId = fromSelection.getWindowId(); + final String fromSelectionId = fromSelection.getSelectionId(); + + final ViewId newViewId = ViewId.random(windowId); + final String newSelectionId = newViewId.getViewId(); + + final String sqlOrderBys = SqlDocumentOrderByBuilder.newInstance(fieldName -> sqlBindings.getFieldByFieldName(fieldName).getSqlOrderBy()) + .buildSqlOrderBy(orderBys) + .evaluate(viewEvalCtx.toEvaluatee(), OnVariableNotFound.Fail); + + final String sqlCreateFromViewId = sqlBindings.getSqlCreateSelectionFromSelection(); + final String sqlFinal = sqlCreateFromViewId.replace(SqlViewBinding.PLACEHOLDER_OrderBy, sqlOrderBys); + + final int rowsCount = DB.executeUpdateEx(sqlFinal, new Object[] { newSelectionId, fromSelectionId }, ITrx.TRXNAME_ThreadInherited); + + return ViewRowIdsOrderedSelection.builder() + .setViewId(newViewId) + .setSize(rowsCount) + .setOrderBys(orderBys) + .setQueryLimit(fromSelection.getQueryLimit()) + .build(); + } + @Override public IViewRow retrieveById(final ViewEvaluationCtx viewEvalCtx, final ViewId viewId, final DocumentId rowId) { @@ -213,7 +231,7 @@ private IViewRow loadViewRow(final ResultSet rs, final WindowId windowId) throws return viewRowBuilder.build(); } - + @Override public DocumentFilterDescriptorsProvider getViewFilterDescriptors() { diff --git a/src/main/java/de/metas/ui/web/view/ViewEvaluationCtx.java b/src/main/java/de/metas/ui/web/view/ViewEvaluationCtx.java index 36aa4a3c3..43ae69afc 100644 --- a/src/main/java/de/metas/ui/web/view/ViewEvaluationCtx.java +++ b/src/main/java/de/metas/ui/web/view/ViewEvaluationCtx.java @@ -81,6 +81,7 @@ public Evaluatee toEvaluatee() .put(AccessSqlStringExpression.PARAM_UserRolePermissionsKey.getName(), permissionsKey.toPermissionsKeyString()) .build() // Fallback to global context + // TODO: consider dropping the fallback because AFAIK only AD_Language and PermissionsKey is required .andComposeWith(Evaluatees.ofCtx(ctx)); return evaluatee; } diff --git a/src/main/java/de/metas/ui/web/view/descriptor/SqlViewBinding.java b/src/main/java/de/metas/ui/web/view/descriptor/SqlViewBinding.java index 65d422d69..89f86acea 100644 --- a/src/main/java/de/metas/ui/web/view/descriptor/SqlViewBinding.java +++ b/src/main/java/de/metas/ui/web/view/descriptor/SqlViewBinding.java @@ -287,7 +287,7 @@ public DocumentFilterDescriptorsProvider getViewFilterDescriptors() { return viewFilterDescriptors; } - + public List getDefaultOrderBys() { return defaultOrderBys; @@ -307,7 +307,7 @@ public Map getSqlOrderBysIndexedByFieldName(final ViewEvaluation final String fieldName = fieldBinding.getFieldName(); sqlOrderBysIndexedByFieldName.put(fieldName, fieldOrderBy); } - + return sqlOrderBysIndexedByFieldName.build(); } @@ -344,7 +344,7 @@ public String getSqlCreateSelectionFromSelection() return sqlBuilder.toString(); } - + public String getSqlCreateSelectionFrom( // final List sqlParams // , final ViewEvaluationCtx viewEvalCtx // @@ -491,7 +491,7 @@ private Map getFieldsByFieldName() { return _fieldsByFieldName; } - + public final Builder addField(SqlViewRowFieldBinding field) { Check.assumeNotNull(field, "Parameter field is not null"); diff --git a/src/main/java/de/metas/ui/web/view/descriptor/SqlViewRowIdsOrderedSelectionFactory.java b/src/main/java/de/metas/ui/web/view/descriptor/SqlViewRowIdsOrderedSelectionFactory.java deleted file mode 100644 index d6543b6c8..000000000 --- a/src/main/java/de/metas/ui/web/view/descriptor/SqlViewRowIdsOrderedSelectionFactory.java +++ /dev/null @@ -1,110 +0,0 @@ -package de.metas.ui.web.view.descriptor; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.adempiere.ad.expression.api.IExpressionEvaluator.OnVariableNotFound; -import org.adempiere.ad.expression.api.IStringExpression; -import org.adempiere.ad.expression.api.impl.ConstantStringExpression; -import org.adempiere.ad.trx.api.ITrx; -import org.adempiere.exceptions.DBException; -import org.compiere.util.DB; -import org.compiere.util.Evaluatees; - -import com.google.common.base.MoreObjects; -import com.google.common.collect.ImmutableMap; - -import de.metas.ui.web.view.IViewRowIdsOrderedSelectionFactory; -import de.metas.ui.web.view.ViewId; -import de.metas.ui.web.view.ViewRowIdsOrderedSelection; -import de.metas.ui.web.window.datatypes.WindowId; -import de.metas.ui.web.window.model.DocumentQueryOrderBy; -import de.metas.ui.web.window.model.sql.SqlDocumentOrderByBuilder; - -/* - * #%L - * metasfresh-webui-api - * %% - * Copyright (C) 2016 metas GmbH - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * . - * #L% - */ - -public class SqlViewRowIdsOrderedSelectionFactory implements IViewRowIdsOrderedSelectionFactory -{ - private final String sqlCreateFromViewId; - private final Map sqlOrderBysByFieldName; - - public SqlViewRowIdsOrderedSelectionFactory(final String sqlCreateFromViewId, final Map sqlOrderBysByFieldName) - { - super(); - this.sqlCreateFromViewId = sqlCreateFromViewId; - this.sqlOrderBysByFieldName = ImmutableMap.copyOf(sqlOrderBysByFieldName); - } - - @Override - public String toString() - { - return MoreObjects.toStringHelper(this) - .add("sql", sqlCreateFromViewId) - .add("sqlOrderBysByFieldName", sqlOrderBysByFieldName) - .toString(); - } - - @Override - public ViewRowIdsOrderedSelection createFromView(final ViewRowIdsOrderedSelection fromView, final List orderBys) - { - final WindowId windowId = fromView.getWindowId(); - final String fromSelectionId = fromView.getSelectionId(); - - final ViewId newViewId = ViewId.random(windowId); - final String newSelectionId = newViewId.getViewId(); - - final List sqlParams = new ArrayList<>(); - final String sqlFinal = buildSqlCreateFromViewId(sqlParams, newSelectionId, fromSelectionId, orderBys); - final int rowsCount = DB.executeUpdateEx(sqlFinal, sqlParams.toArray(), ITrx.TRXNAME_ThreadInherited); - - return ViewRowIdsOrderedSelection.builder() - .setViewId(newViewId) - .setSize(rowsCount) - .setOrderBys(orderBys) - .setQueryLimit(fromView.getQueryLimit()) - .build(); - } - - private String buildSqlCreateFromViewId(final List sqlParams, final String newSelectionId, final String fromSelectionId, final List orderBys) - { - final String sqlOrderBys = SqlDocumentOrderByBuilder.newInstance(this::getFieldOrderBy) - .buildSqlOrderBy(orderBys) - .evaluate(Evaluatees.empty(), OnVariableNotFound.Fail); // assume constant string - final String sqlFinal = sqlCreateFromViewId.replace(SqlViewBinding.PLACEHOLDER_OrderBy, sqlOrderBys); - sqlParams.add(newSelectionId); - sqlParams.add(fromSelectionId); - return sqlFinal; - } - - private final IStringExpression getFieldOrderBy(final String fieldName) - { - final String fieldSql = sqlOrderBysByFieldName.get(fieldName); - if (fieldSql == null) - { - throw new DBException("No SQL field mapping found for: " + fieldName + ". Available fields are: " + sqlOrderBysByFieldName.keySet()); - } - - return ConstantStringExpression.of(fieldSql.trim()); - } -}