Currently I have a custom datasource:
public class EventCardsDatasource extends CustomGroupDatasource<EventCard, UUID> {
MemberService memberService = AppBeans.get(MemberService.NAME);
EventsService eventsService = AppBeans.get(EventsService.NAME);
HashSet<EventCard> eventCards = new HashSet<>();
@Override
public void commit() {
for(Entity i:itemsToCreate) if(((EventCard)i).getState()==ParticipantEventState.fake){
itemsToCreate.remove(i);
}
super.commit();
}
@Override
protected Collection<EventCard> getEntities(Map params) {
Card card = memberService.getCurrentMember();
if (card != null) {
List<EventCard> ecs = eventsService.getEventCardsOfCard(card, "eventFilterScreen-view");
eventCards.addAll(ecs);
}
List<Event> events = eventsService.getAllEvents(null);
for(Event e:events){
//TODO
if(true){
EventCard ec = metadata.create(EventCard.class);
ec.setState(ParticipantEventState.fake);
ec.setEvent(e);
ec.setCard(card);
eventCards.add(ec);
}
}
return eventCards;
}
}
And instead of if(true)
there must be the constraint:
fake EventCard should not be generated for Events for which there are rows already added by eventCards.addAll(ecs);
call that contain that event…
See those eventCards with ParticipantEventState.fake must exist in datasource (well in a table to be precise) but mustn’t be committed. But with such datasource filter doesn’t work. How do I achieve the same with datasouce which uses <query>
instead of custom DSclass?
Also I can’t use memberService.getCurrentMember(); in JPQL but I can use application attribute stored in DB instead, right?
PS: The getEventCardsOfCard
is simply select e from callbook$EventCard e where e.card.id = :cardId