Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,7 @@ private GraphQLJpaExecutorContext(Builder builder) {
@Override
public ExecutionInput.Builder newExecutionInput() {
DataLoaderRegistry dataLoaderRegistry = newDataLoaderRegistry();

GraphQLContext context = graphqlContext.get();

context.put("dataLoaderRegistry", dataLoaderRegistry);
GraphQLContext context = newGraphQLContext(dataLoaderRegistry);

return executionInputFactory.create()
.dataLoaderRegistry(dataLoaderRegistry)
Expand All @@ -80,6 +77,14 @@ public GraphQL.Builder newGraphQL() {
.instrumentation(instrumentation);
}

public GraphQLContext newGraphQLContext(DataLoaderRegistry dataLoaderRegistry) {
GraphQLContext context = graphqlContext.get();

context.put("dataLoaderRegistry", dataLoaderRegistry);

return context;
}

public DataLoaderRegistry newDataLoaderRegistry() {
return dataLoaderRegistry.get();
}
Expand All @@ -97,7 +102,6 @@ public Instrumentation newIstrumentation() {
instrumentation.get());

return new ChainedInstrumentation(list);

}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import static com.introproventures.graphql.jpa.query.support.GraphQLSupport.getSelectionField;
import static com.introproventures.graphql.jpa.query.support.GraphQLSupport.searchByFieldName;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

Expand All @@ -35,31 +36,33 @@
import graphql.schema.DataFetchingEnvironment;

/**
* JPA Query DataFetcher implementation that fetches entities with page and where criteria expressions
*
* JPA Query DataFetcher implementation that fetches entities with page and where criteria expressions
*
* @author Igor Dianov
*
*/
class GraphQLJpaQueryDataFetcher implements DataFetcher<PagedResult<Object>> {

private final static Logger logger = LoggerFactory.getLogger(GraphQLJpaQueryDataFetcher.class);

private final int defaultMaxResults;
private final int defaultPageLimitSize;
private final boolean enableDefaultMaxResults;
private final GraphQLJpaQueryFactory queryFactory;

private GraphQLJpaQueryDataFetcher(Builder builder) {
this.queryFactory = builder.queryFactory;
this.defaultMaxResults = builder.defaultMaxResults;
this.defaultPageLimitSize = builder.defaultPageLimitSize;
this.enableDefaultMaxResults = builder.enableDefaultMaxResults;
}

@Override
public PagedResult<Object> get(DataFetchingEnvironment environment) {
final Field rootNode = environment.getField();
final Optional<Argument> pageArgument = getPageArgument(environment.getField());
final PageArgument page = extractPageArgument(environment, pageArgument, defaultPageLimitSize);

// Let's see which fields we're requesting
Optional<Field> pagesSelection = getSelectionField(rootNode, PAGE_PAGES_PARAM_NAME);
Optional<Field> totalSelection = getSelectionField(rootNode, PAGE_TOTAL_PARAM_NAME);
Expand All @@ -72,32 +75,32 @@ public PagedResult<Object> get(DataFetchingEnvironment environment) {
.withOffset(firstResult)
.withLimit(maxResults);
if (recordsSelection.isPresent()) {
final List<Object> keys = queryFactory.queryKeys(environment,
firstResult,
maxResults);
if(!keys.isEmpty()) {
final List<Object> resultList = queryFactory.queryResultList(environment,
maxResults,
keys);
pagedResult.withSelect(resultList);
List<Object> keys = Collections.emptyList();

if (pageArgument.isPresent() || enableDefaultMaxResults) {
keys = queryFactory.queryKeys(environment, firstResult, maxResults);
}

final List<Object> resultList = queryFactory.queryResultList(environment,
maxResults,
keys);
pagedResult.withSelect(resultList);
}

if (totalSelection.isPresent() || pagesSelection.isPresent()) {

final Long total = queryFactory.queryTotalCount(environment);

pagedResult.withTotal(total);
}

return pagedResult.build();
}


public int getDefaultMaxResults() {
return defaultMaxResults;
}

public int getDefaultPageLimitSize() {
return defaultPageLimitSize;
}
Expand Down Expand Up @@ -133,7 +136,14 @@ public interface IDefaultMaxResultsStage {
* @param defaultMaxResults field to set
* @return builder
*/
public IDefaultPageLimitSizeStage withDefaultMaxResults(int defaultMaxResults);
public IDefaultMaxResultsStage withDefaultMaxResults(int defaultMaxResults);

/**
* Builder method for enableDefaultMaxResults parameter.
* @param enableDefaultMaxResults field to set
* @return builder
*/
public IDefaultPageLimitSizeStage withEnableDefaultMaxResults(boolean enableDefaultMaxResults);
}

/**
Expand Down Expand Up @@ -169,6 +179,7 @@ public static final class Builder implements IQueryFactoryStage, IDefaultMaxResu
private GraphQLJpaQueryFactory queryFactory;
private int defaultMaxResults;
private int defaultPageLimitSize;
private boolean enableDefaultMaxResults;

private Builder() {
}
Expand All @@ -180,7 +191,7 @@ public IDefaultMaxResultsStage withQueryFactory(GraphQLJpaQueryFactory queryFact
}

@Override
public IDefaultPageLimitSizeStage withDefaultMaxResults(int defaultMaxResults) {
public IDefaultMaxResultsStage withDefaultMaxResults(int defaultMaxResults) {
this.defaultMaxResults = defaultMaxResults;
return this;
}
Expand All @@ -195,6 +206,12 @@ public IBuildStage withDefaultPageLimitSize(int defaultPageLimitSize) {
public GraphQLJpaQueryDataFetcher build() {
return new GraphQLJpaQueryDataFetcher(this);
}

@Override
public IDefaultPageLimitSizeStage withEnableDefaultMaxResults(boolean enableDefaultMaxResults) {
this.enableDefaultMaxResults = enableDefaultMaxResults;
return this;
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ public class GraphQLJpaSchemaBuilder implements GraphQLSchemaBuilder {
private int defaultMaxResults = 100;
private int defaultFetchSize = 100;
private int defaultPageLimitSize = 100;
private boolean enableDefaultMaxResults = true;

private final Relay relay = new Relay();

Expand Down Expand Up @@ -264,12 +265,14 @@ private GraphQLFieldDefinition getQueryFieldSelectDefinition(EntityType<?> entit
dataFetcher = GraphQLJpaRelayDataFetcher.builder()
.withQueryFactory(queryFactory)
.withDefaultMaxResults(defaultMaxResults)
.withEnableDefaultMaxResults(enableDefaultMaxResults)
.withDefaultFirstSize(defaultPageLimitSize)
.build();
} else {
dataFetcher = GraphQLJpaQueryDataFetcher.builder()
.withQueryFactory(queryFactory)
.withDefaultMaxResults(defaultMaxResults)
.withEnableDefaultMaxResults(enableDefaultMaxResults)
.withDefaultPageLimitSize(defaultPageLimitSize)
.build();
}
Expand Down Expand Up @@ -1426,4 +1429,14 @@ public GraphQLJpaSchemaBuilder defaultFetchSize(int defaultFetchSize) {
return this;
}

public boolean isEnableDefaultMaxResults() {
return enableDefaultMaxResults;
}

public GraphQLJpaSchemaBuilder enableDefaultMaxResults(boolean enableDefaultMaxResults) {
this.enableDefaultMaxResults = enableDefaultMaxResults;

return this;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.introproventures.graphql.jpa.query.support.GraphQLSupport.getSelectionField;
import static com.introproventures.graphql.jpa.query.support.GraphQLSupport.searchByFieldName;

import java.util.Collections;
import java.util.List;
import java.util.Optional;

Expand All @@ -11,7 +12,6 @@

import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaQueryFactory;
import com.introproventures.graphql.jpa.query.schema.impl.PagedResult;

import graphql.language.Field;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
Expand All @@ -26,60 +26,64 @@ public class GraphQLJpaRelayDataFetcher implements DataFetcher<Page<Object>> {

private final int defaultMaxResults;
private final int defaultFirstSize;
private final boolean enableDefaultMaxResults;
private final GraphQLJpaQueryFactory queryFactory;

private GraphQLJpaRelayDataFetcher(Builder builder) {
this.queryFactory = builder.queryFactory;
this.defaultMaxResults = builder.defaultMaxResults;
this.defaultFirstSize = builder.defaultFirstSize;
this.enableDefaultMaxResults = builder.enableDefaultMaxResults;
}

@Override
public Page<Object> get(DataFetchingEnvironment environment) throws Exception {
final Field rootNode = environment.getField();

Optional<Field> edgesSelection = searchByFieldName(rootNode, EDGES);
Optional<Field> pageInfoSelection = getSelectionField(rootNode, PAGE_INFO);

final Integer first = Optional.<Integer> ofNullable(environment.getArgument(FIRST))
.orElse(defaultFirstSize);

final String after = Optional.<String>ofNullable(environment.getArgument(AFTER))
.orElse(new OffsetBasedCursor(0L).toConnectionCursor()
Optional<Integer> firstArgument = Optional.<Integer>ofNullable(environment.getArgument(FIRST));
Optional<String> afterArgument = Optional.<String>ofNullable(environment.getArgument(AFTER));

final Integer first = firstArgument.orElse(defaultFirstSize);

final String after = afterArgument.orElse(new OffsetBasedCursor(0L).toConnectionCursor()
.toString());

final OffsetBasedCursor cursor = OffsetBasedCursor.fromCursor(after);

final int firstResult = Integer.parseInt(Long.toString(cursor.getOffset()));
final int maxResults = Integer.min(first, defaultMaxResults);

final PagedResult.Builder<Object> pagedResult = PagedResult.builder()
.withOffset(firstResult)
.withLimit(maxResults);

if (edgesSelection.isPresent()) {
final List<Object> keys = queryFactory.queryKeys(environment,
firstResult,
maxResults);
if(!keys.isEmpty()) {
final List<Object> resultList = queryFactory.queryResultList(environment,
maxResults,
keys);
pagedResult.withSelect(resultList);
List<Object> keys = Collections.emptyList();

if (enableDefaultMaxResults || firstArgument.isPresent() || afterArgument.isPresent()) {
keys = queryFactory.queryKeys(environment,
firstResult,
maxResults);
}

final List<Object> resultList = queryFactory.queryResultList(environment,
maxResults,
keys);
pagedResult.withSelect(resultList);
}

if (pageInfoSelection.isPresent()) {

final Long total = queryFactory.queryTotalCount(environment);

pagedResult.withTotal(total);
}

PagedResult<Object> result = pagedResult.build();
return PageFactory.createOffsetBasedPage(result.getSelect(),
result.getTotal(),

return PageFactory.createOffsetBasedPage(result.getSelect(),
result.getTotal(),
result.getOffset());
}

Expand Down Expand Up @@ -114,7 +118,14 @@ public interface IDefaultMaxResultsStage {
* @param defaultMaxResults field to set
* @return builder
*/
public IDefaultFirstSizeStage withDefaultMaxResults(int defaultMaxResults);
public IDefaultMaxResultsStage withDefaultMaxResults(int defaultMaxResults);

/**
* Builder method for enableDefaultMaxResults parameter.
* @param enableDefaultMaxResults field to set
* @return builder
*/
public IDefaultFirstSizeStage withEnableDefaultMaxResults(boolean enableDefaultMaxResults);
}

/**
Expand Down Expand Up @@ -150,6 +161,7 @@ public static final class Builder implements IQueryFactoryStage, IDefaultMaxResu
private GraphQLJpaQueryFactory queryFactory;
private int defaultMaxResults;
private int defaultFirstSize;
private boolean enableDefaultMaxResults;

private Builder() {
}
Expand All @@ -161,7 +173,7 @@ public IDefaultMaxResultsStage withQueryFactory(GraphQLJpaQueryFactory queryFact
}

@Override
public IDefaultFirstSizeStage withDefaultMaxResults(int defaultMaxResults) {
public IDefaultMaxResultsStage withDefaultMaxResults(int defaultMaxResults) {
this.defaultMaxResults = defaultMaxResults;
return this;
}
Expand All @@ -176,6 +188,12 @@ public IBuildStage withDefaultFirstSize(int defaultFirstSize) {
public GraphQLJpaRelayDataFetcher build() {
return new GraphQLJpaRelayDataFetcher(this);
}

@Override
public IDefaultFirstSizeStage withEnableDefaultMaxResults(boolean enableDefaultMaxResults) {
this.enableDefaultMaxResults = enableDefaultMaxResults;
return this;
}
}

}