Skip to content

Instantly share code, notes, and snippets.

@LukasRychtecky
Created September 6, 2022 11:56
Show Gist options
  • Save LukasRychtecky/620bd9acfef3bb31d777c28fe0bb09c2 to your computer and use it in GitHub Desktop.
Save LukasRychtecky/620bd9acfef3bb31d777c28fe0bb09c2 to your computer and use it in GitHub Desktop.
java3.java
public class OrderQuery {
public static FilterableCollection of(Field1 field) {
return new FilterableByQueryField1(field);
}
public static FilterableCollection of(Field2 field) {
return new FilterableByQueryField2(field);
}
public static FilterableCollection of(Field3 field) {
return new FilterableByQueryField3(field);
}
public interface FilterableByQuery<T> {
Collection<T> filterBy(Field1 field1);
Collection<T> filterBy(Field2 field2);
Collection<T> filterBy(Field3 field3);
Collection<T> filterByQuery(FilterableCollection query);
}
public interface FilterableCollection {
public <T> Collection<T> filterBy(FilterableByQuery<T> filter);
}
private static class FilterableByQueryField1 implements FilterableCollection {
private final Field1 field;
private FilterableByQueryField1(Field1 field) {
this.field = field;
}
@Override
public <T> Collection<T> filterBy(FilterableByQuery<T> filter) {
return filter.filterBy(field);
}
}
private static class FilterableByQueryField2 implements FilterableCollection {
private final Field2 field;
private FilterableByQueryField2(Field2 field) {
this.field = field;
}
@Override
public <T> Collection<T> filterBy(FilterableByQuery<T> filter) {
return filter.filterBy(field);
}
}
private static class FilterableByQueryField3 implements FilterableCollection {
private final Field3 field;
private FilterableByQueryField3(Field3 field) {
this.field = field;
}
@Override
public <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.FilterableCollection query) {
return query.filterBy(this);
}
}
// usage
OrderQuery.FilterableCollection query = OrderQuery.of(new Field1("asdf"));
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