All Downloads are FREE. Search and download functionalities are using the official Maven repository.

graphql.execution.MergedField Maven / Gradle / Ivy

There is a newer version: 230521-nf-execution
Show newest version
package graphql.execution;

import graphql.PublicApi;
import graphql.language.Argument;
import graphql.language.Field;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;

import static graphql.Assert.assertNotEmpty;
import static java.util.Collections.unmodifiableList;

/**
 * This represent all Fields in a query which overlap and are merged into one.
 * This means they all represent the same field actually when the query is executed.
 *
 * Example query with more than one Field merged together:
 *
 * 
 * {@code
 *
 *      query Foo {
 *          bar
 *          ...BarFragment
 *      }
 *
 *      fragment BarFragment on Query {
 *          bar
 *      }
 * }
 * 
* * Another example: *
 * {@code
 *     {
 *          me{fistName}
 *          me{lastName}
 *     }
 * }
 * 
* * Here the me field is merged together including the sub selections. * * A third example with different directives: *
 * {@code
 *     {
 *          foo @someDirective
 *          foo @anotherDirective
 *     }
 * }
 * 
* These examples make clear that you need to consider all merged fields together to have the full picture. * * The actual logic when fields can successfully merged together is implemented in {#graphql.validation.rules.OverlappingFieldsCanBeMerged} */ @PublicApi public class MergedField { private final List fields; private final Field singleField; private final String name; private final String resultKey; private MergedField(List fields) { assertNotEmpty(fields); this.fields = unmodifiableList(new ArrayList<>(fields)); this.singleField = fields.get(0); this.name = singleField.getName(); this.resultKey = singleField.getAlias() != null ? singleField.getAlias() : name; } /** * All merged fields have the same name. * * WARNING: This is not always the key in the execution result, because of possible aliases. See {@link #getResultKey()} * * @return the name of of the merged fields. */ public String getName() { return name; } /** * Returns the key of this MergedField for the overall result. * This is either an alias or the field name. * * @return the key for this MergedField. */ public String getResultKey() { return resultKey; } /** * The first of the merged fields. * * Because all fields are almost identically * often only one of the merged fields are used. * * @return the fist of the merged Fields */ public Field getSingleField() { return singleField; } /** * All merged fields share the same arguments. * * @return the list of arguments */ public List getArguments() { return singleField.getArguments(); } /** * All merged fields * * @return all merged fields */ public List getFields() { return fields; } public static Builder newMergedField() { return new Builder(); } public static Builder newMergedField(Field field) { return new Builder().addField(field); } public static Builder newMergedField(List fields) { return new Builder().fields(fields); } public MergedField transform(Consumer builderConsumer) { Builder builder = new Builder(this); builderConsumer.accept(builder); return builder.build(); } public static class Builder { private List fields; private Builder() { this.fields = new ArrayList<>(); } private Builder(MergedField existing) { this.fields = new ArrayList<>(existing.getFields()); } public Builder fields(List fields) { this.fields = fields; return this; } public Builder addField(Field field) { this.fields.add(field); return this; } public MergedField build() { return new MergedField(fields); } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } MergedField that = (MergedField) o; return fields.equals(that.fields); } @Override public int hashCode() { return Objects.hash(fields); } @Override public String toString() { return "MergedField{" + "fields=" + fields + '}'; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy