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 <[email protected]> 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 [email protected] <
> [email protected]> 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