Skip to content

Commit

Permalink
fix: alias in compound index
Browse files Browse the repository at this point in the history
```diff
- UserSchema.index({ name: 1, age: -1 });
+ UserSchema.index({ n: 1, age: -1 });
```
  • Loading branch information
nodkz committed Nov 15, 2023
1 parent c35cbbf commit 2b80ad2
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 26 deletions.
1 change: 0 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
moduleFileExtensions: ['ts', 'js'],
setupFilesAfterEnv: ['<rootDir>/src/setupTests.ts'],
transform: {
'^.+\\.ts$': [
'ts-jest',
Expand Down
2 changes: 1 addition & 1 deletion src/__mocks__/userModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ const UserSchema = new Schema(
);

UserSchema.set('autoIndex', false);
UserSchema.index({ name: 1, age: -1 });
UserSchema.index({ n: 1, age: -1 });

// eslint-disable-next-line
UserSchema.virtual('nameVirtual').get(function (this: any) {
Expand Down
2 changes: 0 additions & 2 deletions src/composeMongoose.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import type { Document, Model } from 'mongoose';
import { convertModelToGraphQL } from './fieldsConverter';
import { resolverFactory } from './resolvers';
import MongoID from './types/MongoID';
import { patchMongooseSchemaIndex } from './utils/patchMongoose';

export type TypeConverterInputTypeOpts = {
/**
Expand Down Expand Up @@ -121,7 +120,6 @@ export function composeMongoose<TDoc extends Document, TContext = any>(
`You try to generate GraphQL Type with name ${name} from mongoose model but this type already exists in SchemaComposer. Please choose another type name "composeWithMongoose(model, { name: 'NewTypeName' })", or reuse existed type "schemaComposer.getOTC('TypeName')", or remove type from SchemaComposer before calling composeWithMongoose method "schemaComposer.delete('TypeName')".`
);
}
patchMongooseSchemaIndex();

if (sc.has(m.schema)) {
// looks like you want to generate new TypeComposer from model
Expand Down
4 changes: 2 additions & 2 deletions src/resolvers/helpers/__tests__/filter-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ describe('Resolver helper `filter` ->', () => {
const itc = args.filter.type as InputTypeComposer;
expect(itc.hasField('_id')).toBe(true);
expect(itc.hasField('name')).toBe(true);
expect(itc.hasField('age')).toBe(true);
expect(itc.hasField('age')).toBe(false);
expect(itc.hasField('gender')).toBe(false);
});

Expand All @@ -104,7 +104,7 @@ describe('Resolver helper `filter` ->', () => {
const itc = args.filter.type as InputTypeComposer;
expect(itc.hasField('_id')).toBe(true);
expect(itc.hasField('name')).toBe(false);
expect(itc.hasField('age')).toBe(true);
expect(itc.hasField('age')).toBe(false);
expect(itc.hasField('gender')).toBe(false);
});

Expand Down
6 changes: 0 additions & 6 deletions src/setupTests.ts

This file was deleted.

24 changes: 10 additions & 14 deletions src/utils/getIndexesFromModel.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { Model } from 'mongoose';
import { prepareAliasesReverse } from '../resolvers/helpers/aliases';

export type getIndexesFromModelOpts = {
extractCompound?: boolean; // true by default
Expand Down Expand Up @@ -36,11 +37,13 @@ export function getIndexesFromModel(
indexedFields.push({ _id: 1 });
}

const reversedAliases = prepareAliasesReverse(mongooseModel.schema);

// scan all fields on index presence [MONGOOSE FIELDS LEVEL INDEX]
Object.keys(mongooseModel.schema.paths).forEach((name) => {
if ((mongooseModel.schema.paths[name] as any)._index) {
const aliasOrName = mongooseModel.schema.paths[name]?.options?.alias || name;
indexedFields.push({ [aliasOrName]: 1 }); // ASC by default
const fieldName = (reversedAliases && reversedAliases[name]) || name;
indexedFields.push({ [fieldName]: 1 }); // ASC by default
}
});

Expand All @@ -56,15 +59,10 @@ export function getIndexesFromModel(
} else {
// extract partial indexes from compound index
// { name: 1, age: 1, salary: 1} -> [{name:1}, {name:1, age:1}, {name:1, age:1, salary:1}]
Object.keys(idxFields).forEach((fieldName: any) => {
const alias = mongooseModel.schema.paths[fieldName]?.options?.alias;
const aliasOrName = alias || fieldName;
partialIndexes[aliasOrName] = idxFields[fieldName];
Object.keys(idxFields).forEach((name: any) => {
const fieldName = (reversedAliases && reversedAliases[name]) || name;
partialIndexes[fieldName] = idxFields[name];
indexedFields.push({ ...partialIndexes });
// push aliases on it's own index if its compound
if (alias) {
indexedFields.push({ [aliasOrName]: idxFields[fieldName] });
}
});
}
}
Expand Down Expand Up @@ -155,10 +153,8 @@ export function getIndexedFieldNamesForGraphQL(model: Model<any>): string[] {
const fieldNames: string[] = [];
indexes.forEach((indexData) => {
const keys = Object.keys(indexData);
for (let i = 0; i < keys.length; i++) {
const clearedName = keys[i].replace(/[^_a-zA-Z0-9]/i, '__');
fieldNames.push(clearedName);
}
const clearedName = keys[0].replace(/[^_a-zA-Z0-9]/i, '__');
fieldNames.push(clearedName);
});
// filter duplicates
const uniqueNames: string[] = [];
Expand Down

0 comments on commit 2b80ad2

Please sign in to comment.