A library that allows to use an adjacency list tree with typeorm and postgres
npm install typeorm-pg-adjacency-list-treehref="https://codeclimate.com/github/slaviqueue/typeorm-pg-adjacency-list-tree/maintainability">src="https://api.codeclimate.com/v1/badges/87bcd3913294f1f2aaf0/maintainability"
/>


This library helps to manage trees that are structured as as adjacency list in
postgres.
It partially implements public interface of TreeRepository from typeorm. Check
tree-repository.interface.ts
Current version of the library is compatible with typeorm >= 0.3.0. If you use
typeorm < 0.3.0, please use typeorm-pg-adjacency-list-tree < 2.0.0.
``bash`
npm i typeorm-pg-adjacency-list-tree
There are three decorators exported from this module: Tree, TreeParent andTreeChildren.
Tree is used to specify that decoratable entity is a tree.
`typescript
@Tree()
@Entity()
export class Node {
@PrimaryGeneratedColumn()
public id!: number
@Column()
public value!: number
}
`
TreeParent is used to identify class property which will hold entities parent:
`typescript
@Tree()
@Entity()
export class Node {
@PrimaryGeneratedColumn()
public id!: number
@TreeParent()
public parent!: Node
@Column()
public value!: number
}
`
TreeChildren is used to identify class property which will hold children of
current entity:
`typescript
@Tree()
@Entity()
export class Node {
@PrimaryGeneratedColumn()
public id!: number
@TreeParent()
public parent!: Node
@TreeChildren()
public children!: Node[]
@Column()
public value!: number
}
`
In the latest major version of typeorm, they decided to drop support for
creating custom repositories with classes. And now the only way to create a
custom repository is to call dataSource.getRepository(Entity).extend({ / your custom repo here / }).
To simplify the process of getting the tree repo, there's a helper function
extendTreeRepository.
If you have any suggestions on how to implement this in a better way, please
create an issue or send a pr.
Instantiating a tree repo from connection:
`typescript
import { extendTreeRepository } from 'typeorm-pg-adjacency-list-tree'
const nodeRepo = extendTreeRepository(dataSource.getRepository(Node))
const roots = await nodeRepo.findRoots()
`
After 0.3, extending a tree repo is not as simple as just extending a class.
We have to get our tree repository first.
`typescript
import { extendTreeRepository } from 'typeorm-pg-adjacency-list-tree'
const userRepo = extendTreeRepository(dataSource.getRepository(User)).extend({
async getByName(name: string) {
return this.find({ where: { name } })
},
})
`
`typescript`
findTrees(options?: FindTreeOptions): Promise
Gets complete trees for all roots in the table.
`typescript`
findRoots(options?: FindTreeOptions): Promise
Roots are entities that have no ancestors. Finds them all.
`typescript`
findDescendants(entity: Entity, options?: FindTreeOptions): Promise
Gets all children (descendants) of the given entity. Returns them all in a flat array.
`typescript`
findDescendantsTree(entity: Entity, options?: FindTreeOptions): Promise
Gets all children (descendants) of the given entity. Returns them in a tree - nested into each other.
`typescript`
countDescendants(entity: Entity): Promise
Gets number of descendants of the entity.
`typescript`
createDescendantsQueryBuilder(alias: string, entity: Entity): Promise
Creates a query builder used to get descendants of the entities in a tree.
`typescript`
findAncestors(entity: Entity, options?: FindTreeOptions): Promise
Creates a query builder used to get descendants of the entities in a tree.
`typescript`
findAncestorsTree(entity: Entity, options?: FindTreeOptions): Promise
Gets all parents (ancestors) of the given entity. Returns them in a tree - nested into each other.
`typescript`
countAncestors(entity: Entity): Promise
Gets number of ancestors of the entity.
`typescript``
createAncestorsQueryBuilder(alias: string, entity: Entity): Promise
Creates a query builder used to get ancestors of the entities in the tree.