Skip to content

Commit

Permalink
fix: Error when sorting by an embedded entity while using join and sk…
Browse files Browse the repository at this point in the history
…ip/take (#7082)

Closes: #7079
  • Loading branch information
H4kor committed Jan 12, 2021
1 parent 568ef35 commit d27dd2a
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/query-builder/SelectQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2004,9 +2004,11 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
const selectString = Object.keys(orderBys)
.map(orderCriteria => {
if (orderCriteria.indexOf(".") !== -1) {
const [aliasName, propertyPath] = orderCriteria.split(".");
const criteriaParts = orderCriteria.split(".");
const aliasName = criteriaParts[0];
const propertyPath = criteriaParts.slice(1).join(".");
const alias = this.expressionMap.findAliasByName(aliasName);
const column = alias.metadata.findColumnWithPropertyName(propertyPath);
const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
return this.escape(parentAlias) + "." + this.escape(DriverUtils.buildColumnAlias(this.connection.driver, aliasName, column!.databaseName));
} else {
if (this.expressionMap.selects.find(select => select.selection === orderCriteria || select.aliasName === orderCriteria))
Expand All @@ -2020,9 +2022,11 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
const orderByObject: OrderByCondition = {};
Object.keys(orderBys).forEach(orderCriteria => {
if (orderCriteria.indexOf(".") !== -1) {
const [aliasName, propertyPath] = orderCriteria.split(".");
const criteriaParts = orderCriteria.split(".");
const aliasName = criteriaParts[0];
const propertyPath = criteriaParts.slice(1).join(".");
const alias = this.expressionMap.findAliasByName(aliasName);
const column = alias.metadata.findColumnWithPropertyName(propertyPath);
const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
orderByObject[this.escape(parentAlias) + "." + this.escape(DriverUtils.buildColumnAlias(this.connection.driver, aliasName, column!.databaseName))] = orderBys[orderCriteria];
} else {
if (this.expressionMap.selects.find(select => select.selection === orderCriteria || select.aliasName === orderCriteria)) {
Expand Down
43 changes: 43 additions & 0 deletions test/github-issues/7079/entities.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "../../../src";


@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@OneToMany(
() => Post,
(post) => post.user,
)
posts: Post[];
}

export class PublishInfo {
@Column({ nullable: true })
date: Date;
}

@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;

@Column()
text: string;

@Column(_type => PublishInfo)
blog: PublishInfo;

@Column(_type => PublishInfo)
newsletter: PublishInfo;

@ManyToOne(
() => User,
(user) => user.posts,
)
user: User
}
62 changes: 62 additions & 0 deletions test/github-issues/7079/issue-7079.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import "reflect-metadata";
import { createTestingConnections, closeTestingConnections, reloadTestingDatabases } from "../../utils/test-utils";
import { Connection } from "../../../src/connection/Connection";
import { expect } from "chai";
import {Post, User} from "./entities"

describe("github issues > #7079 Error when sorting by an embedded entity while using join and skip/take", () => {

let connections: Connection[];
before(async () => connections = await createTestingConnections({
entities: [Post, User],
schemaCreate: true,
dropSchema: true,
}));
beforeEach(() => reloadTestingDatabases(connections));
after(() => closeTestingConnections(connections));

it("should be able to getMany with join and sorting by an embedded entity column while user take and skip", () => Promise.all(connections.map(async connection => {
const postRepo = connection.getRepository(Post)
const userRepo = connection.getRepository(User)

const users = [
{ id: 1, name: "Mike" },
{ id: 2, name: "Alice" }
]
await userRepo.save(users)

const posts = [
{
id: 1,
text: "Happy Holidays",
userId: 1,
blog: { date: new Date().toISOString() },
newsletter: { date: new Date().toISOString() }
},
{
id: 2,
text: "My Vacation",
userId: 1,
blog: { date: new Date().toISOString() },
newsletter: { date: new Date().toISOString() }
},
{
id: 3,
text: "Working with TypeORM",
userId: 2,
blog: { date: new Date().toISOString() },
newsletter: { date: new Date().toISOString() }
}
]
await postRepo.save(posts);

const result = await postRepo.createQueryBuilder("post")
.leftJoinAndSelect("post.user", "user")
.orderBy("post.blog.date")
.take(2)
.skip(1)
.getMany();
expect(result.length).eq(2);
})));

});

0 comments on commit d27dd2a

Please sign in to comment.