fix: empty operator with $or filter (#212)
This commit is contained in:
		
							parent
							
								
									9704f8a342
								
							
						
					
					
						commit
						5d974d7e32
					
				@ -46,4 +46,32 @@ describe('empty operator', () => {
 | 
				
			|||||||
    expect(result.length).toEqual(1);
 | 
					    expect(result.length).toEqual(1);
 | 
				
			||||||
    expect(result[0].get('id')).toEqual(u2.get('id'));
 | 
					    expect(result[0].get('id')).toEqual(u2.get('id'));
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  test('string empty with or operator ', async () => {
 | 
				
			||||||
 | 
					    const u1 = await User.repository.create({
 | 
				
			||||||
 | 
					      values: {
 | 
				
			||||||
 | 
					        name: 'u1',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const u2 = await User.repository.create({
 | 
				
			||||||
 | 
					      values: {
 | 
				
			||||||
 | 
					        name: '',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const u3 = await User.repository.create({
 | 
				
			||||||
 | 
					      values: {
 | 
				
			||||||
 | 
					        name: 'u3',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const result = await User.repository.find({
 | 
				
			||||||
 | 
					      filter: {
 | 
				
			||||||
 | 
					        $or: [{ 'name.$empty': true }, { name: 'u1' }],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(result.length).toEqual(2);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
import { DataTypes, Op } from 'sequelize';
 | 
					import { DataTypes, Op } from 'sequelize';
 | 
				
			||||||
import { ArrayField, StringField } from '../fields';
 | 
					import { ArrayField, StringField } from '../fields';
 | 
				
			||||||
import arrayOperators from './array';
 | 
					import arrayOperators from './array';
 | 
				
			||||||
 | 
					import lodash, { parseInt } from 'lodash';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const findFilterFieldType = (ctx) => {
 | 
					const findFilterFieldType = (ctx) => {
 | 
				
			||||||
  const db = ctx.db;
 | 
					  const db = ctx.db;
 | 
				
			||||||
@ -17,6 +18,10 @@ const findFilterFieldType = (ctx) => {
 | 
				
			|||||||
  const associationPath = path;
 | 
					  const associationPath = path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (const association of associationPath) {
 | 
					  for (const association of associationPath) {
 | 
				
			||||||
 | 
					    if (lodash.isNumber(parseInt(association)) || association.startsWith('$')) {
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    model = model.associations[association].target;
 | 
					    model = model.associations[association].target;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -24,6 +29,7 @@ const findFilterFieldType = (ctx) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return collection.getField(fieldName);
 | 
					  return collection.getField(fieldName);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  $empty(_, ctx) {
 | 
					  $empty(_, ctx) {
 | 
				
			||||||
    const field = findFilterFieldType(ctx);
 | 
					    const field = findFilterFieldType(ctx);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user