diff --git a/src/services/MetaService.ts b/src/services/MetaService.ts index 77fa23e..f11ff96 100644 --- a/src/services/MetaService.ts +++ b/src/services/MetaService.ts @@ -197,6 +197,13 @@ export class MetaService { const exists = this.fields.find((f: any) => f.name === field.name); if (!exists) { this.fields.push(field); + } else if (field.associatedEntity && field.associatedEntity.fields) { + for (const assocEntityField of field.associatedEntity.fields) { + const assocEntityFieldExists = exists.associatedEntity.fields.find((f: { name: string }) => f.name === assocEntityField.name); + if (!assocEntityFieldExists) { + exists.associatedEntity.fields.push(assocEntityField); + } + } } if (typeof field !== 'string') { this.memory[field.name] = field; @@ -256,6 +263,12 @@ export class MetaService { const meta: any = this.memory[cleaned]; if (!meta) { result.push(cleaned); + } else if ( + meta.dataSpecialization === 'INLINE_EMBEDDED' + && meta.associatedEntity + && meta.associatedEntity.fields + && this.getSubFields(field).some(subField => !meta.associatedEntity.fields.find(aef => aef.name === subField))) { + result.push(cleaned); } } return result; @@ -268,6 +281,14 @@ export class MetaService { .split('(')[0]; } + getSubFields(field: string): string[] { + return field + // Remove spaces, [] and {} bracket contents from fields if present + .replace(/\s|(\{[^\}]*?\})|(\[[^\]]*?\])/gi, '') + .match(/(?:\(([^)]*)\))/gi)[0] + .match(/[^,\(\)]+/gi) || []; + } + /** * Get specific meta data properties */ diff --git a/test/MetaService.spec.ts b/test/MetaService.spec.ts index d8b9ffe..2b921a0 100644 --- a/test/MetaService.spec.ts +++ b/test/MetaService.spec.ts @@ -1,47 +1,134 @@ import { MetaService } from '../src'; describe('MetaService', () => { - describe('function: hasMemory', () => { - it('should be defined', () => { - const meta: MetaService = new MetaService('Candidate'); - const actual = meta.hasMemory; - expect(actual).toBeDefined(); - }); - it('should return false when memory is undefined', () => { - const meta: MetaService = new MetaService('Candidate'); - meta.memory = undefined; - const actual = meta.hasMemory(); - expect(actual).toEqual(false); - }); - it('should return false when memory is null', () => { - const meta: MetaService = new MetaService('Candidate'); - meta.memory = null; - const actual = meta.hasMemory(); - expect(actual).toEqual(false); - }); - it('should return false when memory is false', () => { - const meta: MetaService = new MetaService('Candidate'); - meta.memory = false; - const actual = meta.hasMemory(); - expect(actual).toEqual(false); - }); - it('should return false when memory is not an Object', () => { - const meta: MetaService = new MetaService('Candidate'); - meta.memory = []; - const actual = meta.hasMemory(); - expect(actual).toEqual(false); - }); - it('should return false when memory is an empty Object', () => { - const meta: MetaService = new MetaService('Candidate'); - meta.memory = {}; - const actual = meta.hasMemory(); - expect(actual).toEqual(false); - }); - it('should return true when memory is a non-empty Object', () => { - const meta: MetaService = new MetaService('Candidate'); - meta.memory = { test: 'test' }; - const actual = meta.hasMemory(); - expect(actual).toEqual(true); - }); + describe('function: hasMemory', () => { + it('should be defined', () => { + const meta: MetaService = new MetaService('Candidate'); + const actual = meta.hasMemory; + expect(actual).toBeDefined(); }); + it('should return false when memory is undefined', () => { + const meta: MetaService = new MetaService('Candidate'); + meta.memory = undefined; + const actual = meta.hasMemory(); + expect(actual).toEqual(false); + }); + it('should return false when memory is null', () => { + const meta: MetaService = new MetaService('Candidate'); + meta.memory = null; + const actual = meta.hasMemory(); + expect(actual).toEqual(false); + }); + it('should return false when memory is false', () => { + const meta: MetaService = new MetaService('Candidate'); + meta.memory = false; + const actual = meta.hasMemory(); + expect(actual).toEqual(false); + }); + it('should return false when memory is not an Object', () => { + const meta: MetaService = new MetaService('Candidate'); + meta.memory = []; + const actual = meta.hasMemory(); + expect(actual).toEqual(false); + }); + it('should return false when memory is an empty Object', () => { + const meta: MetaService = new MetaService('Candidate'); + meta.memory = {}; + const actual = meta.hasMemory(); + expect(actual).toEqual(false); + }); + it('should return true when memory is a non-empty Object', () => { + const meta: MetaService = new MetaService('Candidate'); + meta.memory = {test: 'test'}; + const actual = meta.hasMemory(); + expect(actual).toEqual(true); + }); + }); + + describe('function: getSubFields', () => { + it('should be defined', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const actual = meta.getSubFields; + expect(actual).toBeDefined(); + }); + it('should return array of fields case 1', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const field = 'jobOrders(id,title,status)'; + const res = meta.getSubFields(field); + expect(res[0]).toBe('id'); + expect(res[1]).toBe('title'); + expect(res[2]).toBe('status'); + }); + it('should return array of fields case 1', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const field = 'jobOrders(id,title,status)'; + const res = meta.getSubFields(field); + expect(res[0]).toBe('id'); + expect(res[1]).toBe('title'); + expect(res[2]).toBe('status'); + }); + it('should return array of fields case 2', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const field = 'jobOrders[3](id,title,status)'; + const res = meta.getSubFields(field); + expect(res[0]).toBe('id'); + expect(res[1]).toBe('title'); + expect(res[2]).toBe('status'); + }); + it('should return array of fields case 3', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const field = 'jobOrders{status=\'closed\'}(id,title,status)'; + const res = meta.getSubFields(field); + expect(res[0]).toBe('id'); + expect(res[1]).toBe('title'); + expect(res[2]).toBe('status'); + }); + it('should return array of fields case 4', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const field = 'jobOrders(id, title, status)'; + const res = meta.getSubFields(field); + expect(res[0]).toBe('id'); + expect(res[1]).toBe('title'); + expect(res[2]).toBe('status'); + }); + it('should return array of fields case 5', () => { + const meta: MetaService = new MetaService('EarnCodeGroup'); + const fields = 'businessSectors[3](name,id){name=\'Insurance\'},category'; + const res = meta.getSubFields(fields); + expect(res[0]).toBe('name'); + expect(res[1]).toBe('id'); + }); + }); + + describe('function: _clean', () => { + it('should be defined', () => { + const meta: MetaService = new MetaService('Candidate'); + const actual = meta._clean; + expect(actual).toBeDefined(); + }); + it('should return a field name case 1', () => { + const meta: MetaService = new MetaService('Candidate'); + const field = 'name'; + const res = meta._clean(field); + expect(res).toBe('name'); + }); + it('should return a field name case 2', () => { + const meta: MetaService = new MetaService('Candidate'); + const field = 'jobOrder(id,title)'; + const res = meta._clean(field); + expect(res).toBe('jobOrder'); + }); + it('should return a field name case 3', () => { + const meta: MetaService = new MetaService('Candidate'); + const field = 'jobOrder[3](id,title)'; + const res = meta._clean(field); + expect(res).toBe('jobOrder'); + }); + it('should return a field name case 4', () => { + const meta: MetaService = new MetaService('Candidate'); + const field = 'jobOrder.title'; + const res = meta._clean(field); + expect(res).toBe('jobOrder'); + }); + }); });