Created
September 5, 2022 12:39
-
-
Save LukasRychtecky/4393946dfb6d887be27136e85f8fc94c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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