/* * SPDX-FileCopyrightText: 2023 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ package tools.refinery.store.query.resultset; import tools.refinery.store.map.Cursor; import tools.refinery.store.query.ModelQueryAdapter; import tools.refinery.store.query.dnf.Query; import tools.refinery.store.query.utils.OrderStatisticTree; import tools.refinery.store.tuple.Tuple; import java.util.Objects; public class OrderedResultSet implements AutoCloseable, ResultSet { private final ResultSet resultSet; private final OrderStatisticTree tree = new OrderStatisticTree<>(); private final ResultSetListener listener = (key, fromValue, toValue) -> { var defaultValue = getCanonicalQuery().defaultValue(); if (Objects.equals(defaultValue, toValue)) { tree.remove(key); } else { tree.add(key); } }; public OrderedResultSet(ResultSet resultSet) { this.resultSet = resultSet; resultSet.addListener(listener); var cursor = resultSet.getAll(); while (cursor.move()) { tree.add(cursor.getKey()); } } @Override public ModelQueryAdapter getAdapter() { return resultSet.getAdapter(); } @Override public int size() { return resultSet.size(); } @Override public Query getCanonicalQuery() { return resultSet.getCanonicalQuery(); } @Override public T get(Tuple parameters) { return resultSet.get(parameters); } public Tuple getKey(int index) { return tree.get(index); } @Override public Cursor getAll() { return resultSet.getAll(); } @Override public void addListener(ResultSetListener listener) { resultSet.addListener(listener); } @Override public void removeListener(ResultSetListener listener) { resultSet.removeListener(listener); } @Override public void close() { resultSet.removeListener(listener); } }