Skip to content

Improve: Introduce ReadOptionsInput #6030

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 12, 2019
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
121 changes: 70 additions & 51 deletions spec/ParseGraphQLServer.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3069,57 +3069,65 @@ describe('ParseGraphQLServer', () => {

describe_only_db('mongo')('read preferences', () => {
it('should read from primary by default', async () => {
await prepareData();
try {
await prepareData();

await parseGraphQLServer.parseGraphQLSchema.databaseController.schemaCache.clear();
await parseGraphQLServer.parseGraphQLSchema.databaseController.schemaCache.clear();

const databaseAdapter =
parseServer.config.databaseController.adapter;
spyOn(
databaseAdapter.database.serverConfig,
'cursor'
).and.callThrough();
const databaseAdapter =
parseServer.config.databaseController.adapter;
spyOn(
databaseAdapter.database.serverConfig,
'cursor'
).and.callThrough();

await apolloClient.query({
query: gql`
query GetSomeObject($id: ID!) {
graphQLClass(id: $id) {
pointerToUser {
username
await apolloClient.query({
query: gql`
query GetSomeObject($id: ID!) {
graphQLClass(id: $id) {
pointerToUser {
username
}
}
}
}
`,
variables: {
id: object3.id,
},
context: {
headers: {
'X-Parse-Session-Token': user1.getSessionToken(),
`,
variables: {
id: object3.id,
},
context: {
headers: {
'X-Parse-Session-Token': user1.getSessionToken(),
},
},
},
});

let foundGraphQLClassReadPreference = false;
let foundUserClassReadPreference = false;
databaseAdapter.database.serverConfig.cursor.calls
.all()
.forEach(call => {
if (call.args[0].ns.collection.indexOf('GraphQLClass') >= 0) {
foundGraphQLClassReadPreference = true;
expect(call.args[0].options.readPreference.mode).toBe(
ReadPreference.PRIMARY
);
} else if (call.args[0].ns.collection.indexOf('_User') >= 0) {
foundUserClassReadPreference = true;
expect(call.args[0].options.readPreference.mode).toBe(
ReadPreference.PRIMARY
);
}
});

expect(foundGraphQLClassReadPreference).toBe(true);
expect(foundUserClassReadPreference).toBe(true);
let foundGraphQLClassReadPreference = false;
let foundUserClassReadPreference = false;
databaseAdapter.database.serverConfig.cursor.calls
.all()
.forEach(call => {
if (
call.args[0].ns.collection.indexOf('GraphQLClass') >= 0
) {
foundGraphQLClassReadPreference = true;
expect(call.args[0].options.readPreference.mode).toBe(
ReadPreference.PRIMARY
);
} else if (
call.args[0].ns.collection.indexOf('_User') >= 0
) {
foundUserClassReadPreference = true;
expect(call.args[0].options.readPreference.mode).toBe(
ReadPreference.PRIMARY
);
}
});

expect(foundGraphQLClassReadPreference).toBe(true);
expect(foundUserClassReadPreference).toBe(true);
} catch (e) {
handleError(e);
}
});

it('should support readPreference argument', async () => {
Expand All @@ -3137,7 +3145,10 @@ describe('ParseGraphQLServer', () => {
await apolloClient.query({
query: gql`
query GetSomeObject($id: ID!) {
graphQLClass(id: $id, readPreference: SECONDARY) {
graphQLClass(
id: $id
options: { readPreference: SECONDARY }
) {
pointerToUser {
username
}
Expand Down Expand Up @@ -3193,8 +3204,10 @@ describe('ParseGraphQLServer', () => {
query GetSomeObject($id: ID!) {
graphQLClass(
id: $id
readPreference: SECONDARY
includeReadPreference: NEAREST
options: {
readPreference: SECONDARY
includeReadPreference: NEAREST
}
) {
pointerToUser {
username
Expand Down Expand Up @@ -3904,7 +3917,9 @@ describe('ParseGraphQLServer', () => {
await apolloClient.query({
query: gql`
query FindSomeObjects {
find: graphQLClasses(readPreference: SECONDARY) {
find: graphQLClasses(
options: { readPreference: SECONDARY }
) {
results {
pointerToUser {
username
Expand Down Expand Up @@ -3958,8 +3973,10 @@ describe('ParseGraphQLServer', () => {
query: gql`
query FindSomeObjects {
graphQLClasses(
readPreference: SECONDARY
includeReadPreference: NEAREST
options: {
readPreference: SECONDARY
includeReadPreference: NEAREST
}
) {
results {
pointerToUser {
Expand Down Expand Up @@ -4016,8 +4033,10 @@ describe('ParseGraphQLServer', () => {
query FindSomeObjects($where: GraphQLClassWhereInput) {
find: graphQLClasses(
where: $where
readPreference: SECONDARY
subqueryReadPreference: NEAREST
options: {
readPreference: SECONDARY
subqueryReadPreference: NEAREST
}
) {
results {
id
Expand Down
19 changes: 19 additions & 0 deletions src/GraphQL/loaders/defaultGraphQLTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,22 @@ const SUBQUERY_READ_PREFERENCE_ATT = {
type: READ_PREFERENCE,
};

const READ_OPTIONS_INPUT = new GraphQLInputObjectType({
name: 'ReadOptionsInput',
description:
'The ReadOptionsInputt type is used in queries in order to set the read preferences.',
fields: {
readPreference: READ_PREFERENCE_ATT,
includeReadPreference: INCLUDE_READ_PREFERENCE_ATT,
subqueryReadPreference: SUBQUERY_READ_PREFERENCE_ATT,
},
});

const READ_OPTIONS_ATT = {
description: 'The read options for the query to be executed.',
type: READ_OPTIONS_INPUT,
};

const WHERE_ATT = {
description:
'These are the conditions that the objects need to match in order to be found',
Expand Down Expand Up @@ -1034,6 +1050,7 @@ const load = parseGraphQLSchema => {
parseGraphQLSchema.addGraphQLType(GEO_POINT, true);
parseGraphQLSchema.addGraphQLType(PARSE_OBJECT, true);
parseGraphQLSchema.addGraphQLType(READ_PREFERENCE, true);
parseGraphQLSchema.addGraphQLType(READ_OPTIONS_INPUT, true);
parseGraphQLSchema.addGraphQLType(SUBQUERY_INPUT, true);
parseGraphQLSchema.addGraphQLType(SELECT_INPUT, true);
parseGraphQLSchema.addGraphQLType(SEARCH_INPUT, true);
Expand Down Expand Up @@ -1098,6 +1115,8 @@ export {
READ_PREFERENCE_ATT,
INCLUDE_READ_PREFERENCE_ATT,
SUBQUERY_READ_PREFERENCE_ATT,
READ_OPTIONS_INPUT,
READ_OPTIONS_ATT,
WHERE_ATT,
SKIP_ATT,
LIMIT_ATT,
Expand Down
13 changes: 5 additions & 8 deletions src/GraphQL/loaders/parseClassQueries.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ const getParseClassQueryConfig = function(
};

const getQuery = async (className, _source, args, context, queryInfo) => {
const { id, readPreference, includeReadPreference } = args;
const { id, options } = args;
const { readPreference, includeReadPreference } = options || {};
const { config, auth, info } = context;
const selectedFields = getFieldNames(queryInfo);

Expand Down Expand Up @@ -58,8 +59,7 @@ const load = function(
description: `The ${getGraphQLQueryName} query can be used to get an object of the ${graphQLClassName} class by its id.`,
args: {
id: defaultGraphQLTypes.OBJECT_ID_ATT,
readPreference: defaultGraphQLTypes.READ_PREFERENCE_ATT,
includeReadPreference: defaultGraphQLTypes.INCLUDE_READ_PREFERENCE_ATT,
options: defaultGraphQLTypes.READ_OPTIONS_ATT,
},
type: new GraphQLNonNull(
classGraphQLOutputType || defaultGraphQLTypes.OBJECT
Expand All @@ -86,15 +86,12 @@ const load = function(
),
async resolve(_source, args, context, queryInfo) {
try {
const { where, order, skip, limit, options } = args;
const {
where,
order,
skip,
limit,
readPreference,
includeReadPreference,
subqueryReadPreference,
} = args;
} = options || {};
const { config, auth, info } = context;
const selectedFields = getFieldNames(queryInfo);

Expand Down
11 changes: 3 additions & 8 deletions src/GraphQL/loaders/parseClassTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -366,9 +366,7 @@ const load = (
},
skip: defaultGraphQLTypes.SKIP_ATT,
limit: defaultGraphQLTypes.LIMIT_ATT,
readPreference: defaultGraphQLTypes.READ_PREFERENCE_ATT,
includeReadPreference: defaultGraphQLTypes.INCLUDE_READ_PREFERENCE_ATT,
subqueryReadPreference: defaultGraphQLTypes.SUBQUERY_READ_PREFERENCE_ATT,
options: defaultGraphQLTypes.READ_OPTIONS_ATT,
};

const classGraphQLOutputTypeName = `${graphQLClassName}`;
Expand All @@ -395,15 +393,12 @@ const load = (
type,
async resolve(source, args, context, queryInfo) {
try {
const { where, order, skip, limit, options } = args;
const {
where,
order,
skip,
limit,
readPreference,
includeReadPreference,
subqueryReadPreference,
} = args;
} = options || {};
const { config, auth, info } = context;
const selectedFields = getFieldNames(queryInfo);

Expand Down