From afe619da419de63adc7e3ff0a5049b139301196a Mon Sep 17 00:00:00 2001 From: Teo Sarca Date: Tue, 5 Dec 2017 23:22:13 +0200 Subject: [PATCH] HUEditorViewBuffer_HighVolume: sorting support (partial) --- .../HUEditorViewBuffer_HighVolume.java | 47 +++++++++++-------- .../handlingunits/HUEditorViewRepository.java | 6 ++- .../SqlHUEditorViewRepository.java | 8 +++- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewBuffer_HighVolume.java b/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewBuffer_HighVolume.java index afc253a72..2f69bd97a 100644 --- a/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewBuffer_HighVolume.java +++ b/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewBuffer_HighVolume.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.function.UnaryOperator; import java.util.stream.Stream; @@ -57,7 +58,10 @@ public class HUEditorViewBuffer_HighVolume implements HUEditorViewBuffer private final HUEditorViewRepository huEditorRepo; private final ImmutableList stickyFilters; + private final AtomicReference defaultSelectionRef; + private final transient ConcurrentHashMap, ViewRowIdsOrderedSelection> selectionsByOrderBys = new ConcurrentHashMap<>(); + private final CCache cache_huRowsById = CCache.newLRUCache(I_M_HU.Table_Name + "#HUEditorRows#by#Id", 100, 2); HUEditorViewBuffer_HighVolume( @@ -85,12 +89,32 @@ private ViewRowIdsOrderedSelection getDefaultSelection() { return defaultSelectionRef.get(); } + + private ViewRowIdsOrderedSelection getSelection(final List orderBys) + { + final ViewRowIdsOrderedSelection defaultSelection = getDefaultSelection(); + + if (orderBys == null || orderBys.isEmpty()) + { + return defaultSelection; + } + + if (Objects.equals(defaultSelection.getOrderBys(), orderBys)) + { + return defaultSelection; + } + + return selectionsByOrderBys.computeIfAbsent(ImmutableList.copyOf(orderBys), orderBysImmutable -> huEditorRepo.createSelectionFromSelection(defaultSelection, orderBysImmutable)); + } + /** @return true if selection was really changed */ - private boolean changeDefaultSelection(final UnaryOperator mapper) + private boolean changeSelection(final UnaryOperator mapper) { final ViewRowIdsOrderedSelection defaultSelectionOld = defaultSelectionRef.get(); final ViewRowIdsOrderedSelection defaultSelectionNew = defaultSelectionRef.updateAndGet(mapper); + selectionsByOrderBys.clear(); // invalidate all the other selections, let it recompute when needed + return !Objects.equals(defaultSelectionOld, defaultSelectionNew); } @@ -127,7 +151,7 @@ public boolean addHUIds(final Collection huIdsToAdd) return false; } - return changeDefaultSelection(defaultSelection -> huEditorRepo.addRowIdsToSelection(defaultSelection, rowIdsToAdd)); + return changeSelection(defaultSelection -> huEditorRepo.addRowIdsToSelection(defaultSelection, rowIdsToAdd)); } @Override @@ -142,7 +166,7 @@ public boolean removeHUIds(final Collection huIdsToRemove) rowIdsToRemove.forEach(rowId -> cache_huRowsById.remove(rowId)); - return changeDefaultSelection(defaultSelection -> huEditorRepo.removeRowIdsFromSelection(defaultSelection, rowIdsToRemove)); + return changeSelection(defaultSelection -> huEditorRepo.removeRowIdsFromSelection(defaultSelection, rowIdsToRemove)); } @Override @@ -215,23 +239,6 @@ public Stream streamPage( .stream(); } - private ViewRowIdsOrderedSelection getSelection(final List orderBys) - { - final ViewRowIdsOrderedSelection defaultSelection = getDefaultSelection(); - - if (orderBys == null || orderBys.isEmpty()) - { - return defaultSelection; - } - - if (!Objects.equals(orderBys, defaultSelection.getOrderBys())) - { - throw new UnsupportedOperationException("Sorting is not supported"); - } - - return defaultSelection; - } - private PageFetcher huIdsPageFetcher(final List orderBys) { final ViewRowIdsOrderedSelection selection = getSelection(orderBys); diff --git a/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewRepository.java b/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewRepository.java index aae9cf772..ffe075aea 100644 --- a/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewRepository.java +++ b/src/main/java/de/metas/ui/web/handlingunits/HUEditorViewRepository.java @@ -38,6 +38,10 @@ public interface HUEditorViewRepository { void invalidateCache(); + ViewRowIdsOrderedSelection createSelection(ViewId viewId, List filters, List orderBys); + + ViewRowIdsOrderedSelection createSelectionFromSelection(ViewRowIdsOrderedSelection fromSelection, List orderBys); + List retrieveHUEditorRows(Set huIds, HUEditorRowFilter filter); /** @@ -52,8 +56,6 @@ public interface HUEditorViewRepository Page retrieveHUIdsPage(ViewRowIdsOrderedSelection selection, int firstRow, int maxRows); - ViewRowIdsOrderedSelection createSelection(ViewId viewId, List filters, List orderBys); - ViewRowIdsOrderedSelection addRowIdsToSelection(ViewRowIdsOrderedSelection selection, DocumentIdsSelection rowIdsToAdd); ViewRowIdsOrderedSelection removeRowIdsFromSelection(ViewRowIdsOrderedSelection selection, DocumentIdsSelection rowIdsToRemove); diff --git a/src/main/java/de/metas/ui/web/handlingunits/SqlHUEditorViewRepository.java b/src/main/java/de/metas/ui/web/handlingunits/SqlHUEditorViewRepository.java index 94d145fcc..672aa05d2 100644 --- a/src/main/java/de/metas/ui/web/handlingunits/SqlHUEditorViewRepository.java +++ b/src/main/java/de/metas/ui/web/handlingunits/SqlHUEditorViewRepository.java @@ -107,7 +107,6 @@ public class SqlHUEditorViewRepository implements HUEditorViewRepository private final ViewRowIdsOrderedSelectionFactory viewSelectionFactory; private final SqlViewSelectData sqlViewSelect; - @Builder private SqlHUEditorViewRepository( @NonNull final WindowId windowId, @@ -558,6 +557,13 @@ public ViewRowIdsOrderedSelection createSelection(final ViewId viewId, final Lis return viewSelectionFactory.createOrderedSelection(viewEvalCtx, viewId, filters, orderBys); } + @Override + public ViewRowIdsOrderedSelection createSelectionFromSelection(final ViewRowIdsOrderedSelection fromSelection, final List orderBys) + { + final ViewEvaluationCtx viewEvalCtx = ViewEvaluationCtx.of(Env.getCtx()); + return viewSelectionFactory.createOrderedSelectionFromSelection(viewEvalCtx, fromSelection, orderBys); + } + @Override public ViewRowIdsOrderedSelection addRowIdsToSelection(final ViewRowIdsOrderedSelection selection, final DocumentIdsSelection rowIdsToAdd) {