chore: should not return children property when child nodes are empty (#1825)

This commit is contained in:
ChengLei Shao 2023-05-09 16:48:40 +08:00 committed by GitHub
parent 088acd906d
commit 8183ff5564
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 4 deletions

View File

@ -16,6 +16,63 @@ describe('tree test', function () {
await db.close(); await db.close();
}); });
it('should not return children property when child nodes are empty', 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({
filter: {
parentId: null,
},
});
const c2 = tree.find((item) => item.name === 'c2');
expect(c2.toJSON()['children']).toBeUndefined();
const c11 = tree
.find((item) => item.name === 'c1')
.get('children')
.find((item) => item.name === 'c11');
expect(c11.toJSON()['children']).toBeUndefined();
});
it('should add sort field', async () => { it('should add sort field', async () => {
const Tasks = db.collection({ const Tasks = db.collection({
name: 'tasks', name: 'tasks',

View File

@ -263,7 +263,7 @@ export class Repository<TModelAttributes extends {} = any, TCreationAttributes e
* find * find
* @param options * @param options
*/ */
async find(options?: FindOptions) { async find(options: FindOptions = {}) {
const model = this.collection.model; const model = this.collection.model;
const transaction = await this.getTransaction(options); const transaction = await this.getTransaction(options);

View File

@ -9,7 +9,7 @@ export class AdjacencyListRepository extends Repository {
}); });
} }
async find(options?: FindOptions & { addIndex?: boolean }): Promise<any> { async find(options: FindOptions & { addIndex?: boolean } = {}): Promise<any> {
const parentNodes = await super.find(lodash.omit(options)); const parentNodes = await super.find(lodash.omit(options));
if (options.raw) { if (options.raw) {
@ -80,7 +80,10 @@ export class AdjacencyListRepository extends Repository {
} }
return children.map((child) => { return children.map((child) => {
child.setDataValue(childrenKey, buildTree(child.id)); const childrenValues = buildTree(child.id);
if (childrenValues.length > 0) {
child.setDataValue(childrenKey, childrenValues);
}
return child; return child;
}); });
} }
@ -88,7 +91,9 @@ export class AdjacencyListRepository extends Repository {
for (const parent of parentNodes) { for (const parent of parentNodes) {
const parentId = parent[primaryKey]; const parentId = parent[primaryKey];
const children = buildTree(parentId); const children = buildTree(parentId);
parent.setDataValue(childrenKey, children); if (children.length > 0) {
parent.setDataValue(childrenKey, children);
}
} }
this.addIndex(parentNodes, childrenKey, options); this.addIndex(parentNodes, childrenKey, options);