diff --git a/packages/core/database/src/__tests__/tree.test.ts b/packages/core/database/src/__tests__/tree.test.ts index 30ff7e013..a9a4979da 100644 --- a/packages/core/database/src/__tests__/tree.test.ts +++ b/packages/core/database/src/__tests__/tree.test.ts @@ -16,6 +16,57 @@ describe('tree test', function () { await db.close(); }); + it('should works with appends option', async () => { + const collection = db.collection({ + name: 'categories', + tree: 'adjacency-list', + fields: [ + { type: 'string', name: 'name' }, + { + type: 'belongsTo', + name: 'parent', + treeParent: true, + }, + { + type: 'hasMany', + name: 'children', + treeChildren: true, + }, + ], + }); + + await db.sync(); + + await collection.repository.create({ + values: [ + { + name: 'c1', + children: [ + { + name: 'c11', + }, + { + name: 'c12', + }, + ], + }, + { + name: 'c2', + }, + ], + }); + + const tree = await collection.repository.find({ + tree: true, + filter: { + parentId: null, + }, + fields: ['name'], + }); + + expect(tree.length).toBe(2); + }); + it('should not return children property when child nodes are empty', async () => { const collection = db.collection({ name: 'categories', @@ -60,6 +111,7 @@ describe('tree test', function () { filter: { parentId: null, }, + tree: true, }); const c2 = tree.find((item) => item.name === 'c2'); diff --git a/packages/core/database/src/tree-repository/adjacency-list-repository.ts b/packages/core/database/src/tree-repository/adjacency-list-repository.ts index 1f67cd5f1..5d2a49034 100644 --- a/packages/core/database/src/tree-repository/adjacency-list-repository.ts +++ b/packages/core/database/src/tree-repository/adjacency-list-repository.ts @@ -10,20 +10,22 @@ export class AdjacencyListRepository extends Repository { } async find(options: FindOptions & { addIndex?: boolean } = {}): Promise { - const parentNodes = await super.find(lodash.omit(options)); - - if (options.raw) { - return parentNodes; + if (options.raw || !options.tree) { + return await super.find(options); } + const collection = this.collection; + const primaryKey = collection.model.primaryKeyAttribute; + + if (options.fields && !options.fields.includes(primaryKey)) { + options.fields.push(primaryKey); + } + + const parentNodes = await super.find(options); if (parentNodes.length === 0) { return []; } - const templateModel = parentNodes[0]; - - const collection = this.collection; - const primaryKey = collection.model.primaryKeyAttribute; const { treeParentField } = collection; const foreignKey = treeParentField.options.foreignKey;