FWIW, there were requests for this functionality previously, but it was hard to 
achieve full feature parity between in-memory and DB evaluation, so we didn't 
do it yet. Perhaps we should do it incrementally over time, addressing various 
edge cases as we uncover them.

Andrus


> On Nov 16, 2020, at 11:29 PM, giulio.ces...@gmail.com wrote:
> 
> Thanks!!
> 
> I need to look carefully into this code, but it looks very promising.
> 
> Cheers,
> 
> Giulio Cesare
> 
> 
> On Mon, Nov 16, 2020 at 7:53 PM John Huss <johnth...@gmail.com> wrote:
> 
>> There isn't anything built-in. I use this method in my own DataContext
>> subclass to do it. Use at your own risk, etc.
>> 
>> *public* <T *extends* Persistent> List<T>
>> selectIncludingPendingChanges(ObjectSelect<T> query) {
>> 
>> Set<Object> newAndModified = *new* HashSet<>(newObjects());
>> 
>> newAndModified.addAll(modifiedObjects());
>> 
>> Set<T> inMemoryResults = newAndModified.stream()
>> 
>> .filter(o -> o.getClass().equals(query.getEntityType()))
>> 
>> .filter(o -> query.getWhere().match(o))
>> 
>> .map(o -> (T)o)
>> 
>> .collect(Collectors.*toSet*());
>> 
>> List<T> dbResults = select(query);
>> 
>> dbResults.removeAll(newAndModified); // these have already been checked
>> 
>> dbResults.removeAll(deletedObjects());
>> 
>> *if* (inMemoryResults.isEmpty()) {
>> 
>> *return* dbResults; // performance optimization
>> 
>> }
>> 
>> inMemoryResults.addAll(dbResults); // combines and removes duplicates
>> 
>> List<T> results = *new* ArrayList<>(inMemoryResults);
>> 
>> *if* (query.getOrderings() != *null* && !query.getOrderings().isEmpty()) {
>> 
>> Ordering.*orderList*(results, *new* ArrayList<>(query.getOrderings()));
>> 
>> }
>> 
>> *if* (query.getLimit() > 0) {
>> 
>> results = results.subList(0, query.getLimit());
>> 
>> }
>> 
>> *return* (List<T>) results;
>> 
>> }
>> 
>> 
>> *public* *static* *class* Factory *extends* DataContextFactory {
>> 
>> @Override
>> 
>> *protected* MyDataContext newInstance(DataChannel parent, ObjectStore
>> objectStore) {
>> 
>> *return* *new* MyDataContext(parent, objectStore);
>> 
>> }
>> 
>> }
>> 
>> 
>> *public* *static* *final* Module *MODULE* = binder ->
>> 
>> 
>> binder.bind(ObjectContextFactory.*class*).to(MyDataContext.Factory.*class*);
>> 
>> 
>> 
>> On Sat, Nov 14, 2020 at 10:20 AM giulio.ces...@gmail.com <
>> giulio.ces...@gmail.com> wrote:
>> 
>>> Hello,
>>> 
>>> I have multiple places where I have to search data either on the current
>>> ObjectStore (newly inserted or modified objects) or directly in the DB.
>>> 
>>> At the moment I have two distinct blocks of code, one expressed as a
>>> Predicate (used inside a stream filter) and the other with an
>> ObjectSelect
>>> (on which I call its select method).
>>> 
>>> As both structure encode the same "logic" criteria, it would be nice to
>> be
>>> able to derive one from the other.
>>> 
>>> One way to solve this would be to be able to transform on ObjectSelect
>>> instance into a Predicate instance.
>>> Or, the ability to run an ObjectSelect not only on the DB, but also into
>>> the uncommitted objects in the ObjectContext.
>>> 
>>> Is there anything I am missing that could help me dealing with this need?
>>> 
>>> Cheers,
>>> 
>>> Giulio Cesare
>>> 
>> 

Reply via email to