public static <K, V> @Nullable Boolean processFilesContainingAllKeys(@NotNull ID<K, V> indexId,
                                                                       @NotNull Collection<? extends K> dataKeys,
                                                                       @NotNull GlobalSearchScope scope,
                                                                       @Nullable Condition<? super V> valueChecker,
                                                                       @NotNull Processor<? super VirtualFile> processor) {
    if (indexId == IdIndex.NAME && Registry.is("indexing.id.over.vfs")) {
      Project project = scope.getProject();
      InThisThreadProcessor threadProcessor = new InThisThreadProcessor();
      Function<VirtualFile, ? extends Map<K, V>> indexer = getIndexer(indexId, project, false);
      return processFilesInScope(indexId, scope, false, null, file -> {
        Map<K, V> map = indexer.apply(file);
        if (map == null) return true;
        for (K key : dataKeys) {
          V value = map.get(key);
          if (value == null) return true;
          if (valueChecker != null && !valueChecker.value(value)) return true;
        }
        return threadProcessor.process(() -> processor.process(file));
      }) && threadProcessor.processQueue();
    }
    return null;
  }
public static <K, V> @Nullable Boolean processFilesContainingAllKeys(@NotNull ID<K, V> indexId,
                                                                       @NotNull Collection<? extends K> dataKeys,
                                                                       @NotNull GlobalSearchScope scope,
                                                                       @Nullable Condition<? super V> valueChecker,
                                                                       @NotNull Processor<? super VirtualFile> processor)