docs: public static <T> FilterOperation createFilter( NavigableMap<T, String> keysByValue,
                                                      Converter<T> converter,
                                                      Collection<Constraint> constraints,
                                                      Map<String, Object> variables ) {
          if (keysByValue.isEmpty()) return EMPTY_FILTER_OPERATION;
          NodeKeysAccessor<T, String> nodeKeysAccessor = new NodeKeysAccessor<T, String>() {
              @Override
              public Iterator<String> getNodeKeys( NavigableMap<T, String> keysByValue ) {
                  return keysByValue.values().iterator();
              }
  
              @Override
              public void addAllTo( NavigableMap<T, String> keysByValue,
                                    Set<String> matchedKeys ) {
                  matchedKeys.addAll(keysByValue.values());
              }
          };
          OperationBuilder<T> builder = new BasicOperationBuilder<>(keysByValue, converter, nodeKeysAccessor, variables);
          for (Constraint constraint : constraints) {
              OperationBuilder<T> newBuilder = builder.apply(constraint, false);
              if (newBuilder != null) builder = newBuilder;
          }
          return builder;
      }