Skip to content

Instantly share code, notes, and snippets.

@LukasRychtecky
Created September 5, 2022 12:39
Show Gist options
  • Save LukasRychtecky/4393946dfb6d887be27136e85f8fc94c to your computer and use it in GitHub Desktop.
Save LukasRychtecky/4393946dfb6d887be27136e85f8fc94c to your computer and use it in GitHub Desktop.
public abstract class OrderQuery {
public static OrderQuery of(Field1 field) {
return new FilterableByQueryField1(field);
}
public static OrderQuery of(Field2 field) {
return new FilterableByQueryField2(field);
}
public static OrderQuery of(Field3 field) {
return new FilterableByQueryField3(field);
}
abstract <T> Collection<T> filterBy(FilterableByQuery<T> filter);
public interface FilterableByQuery<T> {
Collection<T> filterBy(Field1 field1);
Collection<T> filterBy(Field2 field2);
Collection<T> filterBy(Field3 field3);
Collection<T> filterByQuery(OrderQuery query);
}
private static class FilterableByQueryField1 extends OrderQuery {
private final Field1 field;
private FilterableByQueryField1(Field1 field) {
this.field = field;
}
@Override
<T> Collection<T> filterBy(FilterableByQuery<T> filter) {
return filter.filterBy(field);
}
}
private static class FilterableByQueryField2 extends OrderQuery {
private final Field2 field;
private FilterableByQueryField2(Field2 field) {
this.field = field;
}
@Override
<T> Collection<T> filterBy(FilterableByQuery<T> filter) {
return filter.filterBy(field);
}
}
private static class FilterableByQueryField3 extends OrderQuery {
private final Field3 field;
private FilterableByQueryField3(Field3 field) {
this.field = field;
}
@Override
<T> Collection<T> filterBy(FilterableByQuery<T> filter) {
return filter.filterBy(field);
}
}
}
// repository
public class OrderRepository implements OrderQuery.FilterableByQuery<Order> {
@Override
public Collection<Order> filterBy(Field1 field1) {
throw new RuntimeException("Not implemented");
}
@Override
public Collection<Order> filterBy(Field2 field2) {
throw new RuntimeException("Not implemented");
}
@Override
public Collection<Order> filterBy(Field3 field3) {
throw new RuntimeException("Not implemented");
}
@Override
public Collection<Order> filterByQuery(OrderQuery query) {
return query.filterBy(this);
}
}
// usage
OrderQuery query = OrderQuery.of(new Field1("asdf"));
Collection<Order> orders = query.filterBy(this.repository);
// or
Collection<Order> orders = this.repository.filterByQuery(query);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment