private Map<String, FilteringPropertyFilter> createSubfilters(
      final Class<?> entityClass, final Map<String, ObjectGraph> entitySubgraphs) {
    final Set<String> processed = Sets.newHashSet();
    final Map<String, FilteringPropertyFilter> subfilters = Maps.newHashMap();

    for (final Map.Entry<String, ObjectGraph> entry : entitySubgraphs.entrySet()) {
      final String fieldName = entry.getKey();

      if (fieldName.startsWith("_")) continue;

      final ObjectGraph graph = entry.getValue();

      // Subgraph Fields.
      final Map<String, ObjectGraph> subgraphs = graph.getSubgraphs(fieldName);

      Map<String, FilteringPropertyFilter> subSubfilters = Maps.newHashMap();
      if (!subgraphs.isEmpty()) {
        final Class<?> subEntityClass = graph.getEntityClass();

        processed.add(getProcessedSubgraph(entityClass, fieldName, subEntityClass));
        subSubfilters = createSubfilters(fieldName, subEntityClass, subgraphs, processed);
      }

      final FilteringPropertyFilter filter =
          new FilteringPropertyFilter(
              graph.getEntityClass(), graph.getFields(fieldName), subSubfilters);

      subfilters.put(fieldName, filter);
    }

    return subfilters;
  }
  /** {@inheritDoc} */
  @Override
  public FilterProvider transform(final ObjectGraph graph) {
    // Root entity.
    final FilteringPropertyFilter root =
        new FilteringPropertyFilter(
            graph.getEntityClass(),
            graph.getFields(),
            createSubfilters(graph.getEntityClass(), graph.getSubgraphs()));

    return new FilteringFilterProvider(root);
  }
  private Map<String, FilteringPropertyFilter> createSubfilters(
      final String parent,
      final Class<?> entityClass,
      final Map<String, ObjectGraph> entitySubgraphs,
      final Set<String> processed) {
    final Map<String, FilteringPropertyFilter> subfilters = Maps.newHashMap();

    for (final Map.Entry<String, ObjectGraph> entry : entitySubgraphs.entrySet()) {
      final String fieldName = entry.getKey();

      if (fieldName.startsWith("_")) continue;

      final ObjectGraph graph = entry.getValue();

      final String path = parent + "." + fieldName;

      // Subgraph Fields.
      final Map<String, ObjectGraph> subgraphs = graph.getSubgraphs(path);

      final Class<?> subEntityClass = graph.getEntityClass();
      final String processedSubgraph = getProcessedSubgraph(entityClass, fieldName, subEntityClass);

      Map<String, FilteringPropertyFilter> subSubfilters = Maps.newHashMap();
      if (!subgraphs.isEmpty() && !processed.contains(processedSubgraph)) {
        processed.add(processedSubgraph);
        subSubfilters = createSubfilters(path, subEntityClass, subgraphs, processed);
      }

      subfilters.put(
          fieldName,
          new FilteringPropertyFilter(
              graph.getEntityClass(), graph.getFields(path), subSubfilters));
    }

    return subfilters;
  }