package graphql.execution.batched; import graphql.schema.DataFetchingEnvironment; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * <p> * When placed on {@link graphql.schema.DataFetcher#get(DataFetchingEnvironment)}, indicates that this DataFetcher is batched. * This annotation must be used in conjunction with {@link BatchedExecutionStrategy}. Batching is valuable in many * situations, such as when a {@link graphql.schema.DataFetcher} must make a network or file system request. * </p> * <p> * When a {@link graphql.schema.DataFetcher} is batched, the {@link DataFetchingEnvironment#getSource()} method is * guaranteed to return a {@link java.util.List}. The {@link graphql.schema.DataFetcher#get(DataFetchingEnvironment)} * method MUST return a parallel {@link java.util.List} which is equivalent to running a {@link graphql.schema.DataFetcher} * over each input element individually. * </p> * <p> * Using the {@link Batched} annotation is equivalent to implementing {@link BatchedDataFetcher} instead of {@link graphql.schema.DataFetcher}. * It is preferred to use the {@link Batched} annotation. * </p> * For example, the following two {@link graphql.schema.DataFetcher} objects are interchangeable if used with a * {@link BatchedExecutionStrategy}. * <pre> * <code> * new DataFetcher() { * {@literal @}Override * {@literal @}Batched * public Object get(DataFetchingEnvironment environment) { * {@literal List<String> retVal = new ArrayList<>();} * {@literal for (String s: (List<String>) environment.getSource()) {} * retVal.add(s + environment.getArgument("text")); * } * return retVal; * } * } * </code> * </pre> * <pre> * <code> * new DataFetcher() { * {@literal @}Override * public Object get(DataFetchingEnvironment e) { * return ((String)e.getSource()) + e.getArgument("text"); * } * } * </code> * </pre> */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Batched { }