Ho stream (grandezza 10s di milioni) di entità, ad esempio Item che è modellato come segue:
class Item {
String id;
Double price;
Double profitPercentage;
Country originCountry;
Country destinationCountry;
...
}
Tutti gli attributi di questa entità sono ben definiti e sono limitati alle informazioni relative ai prezzi + ai metadati.
Vorrei dare a un utente la possibilità di creare bucket, che non sono altro che una serie di vincoli sull'attributo (ad es. price > 1000, originCountry == Country.USA, profitPercentage tra 5 e 20), ma con la condizione che un'entità non possa cadere in due bucket (lo stesso dovrebbe essere rilevato quando viene effettuato un tentativo di creare un Bucket in conflitto tra loro).
Anche le operazioni su ciascun tipo di entità sono ben definite, ad es. Il doppio può essere utilizzato solo nei confronti (>, <, =, intervallo), Paese (che rappresenta logicamente un membro di un insieme di valori ben definito) in alcuni set ecc.)
Ciò è dovuto principalmente al fatto che ciascun bucket è associato a un'azione automatizzata, come il pagamento, il rifiuto o il rimborso, e la risoluzione delle azioni sovrapposte non è banale.
L'ovvia soluzione a questo problema è consentire all'utente di definire priorità sui bucket creati (implica che più bucket possano corrispondere a una data entità), ma è una cosa che vorrei evitare, poiché richiede che non ci possa mai essere due bucket aventi la stessa priorità e tale eventualità non riuscirebbe in fase di esecuzione.
Sto cercando soluzioni che potrebbero essere utilizzate per rilevare i conflitti durante il tempo di creazione, ma non ho idea di dove cominciare. Altri hanno suggerito una sorta di SMT Solver (Z3 era raccomandato), ma non sono consapevole che sia del tutto fattibile.