Browse Source

fix(core): Fix sorting of Order calculated properties in Postgres

Michael Bromley 4 years ago
parent
commit
e9b18fe74d

+ 14 - 2
packages/core/e2e/fixtures/test-plugins/list-query-plugin.ts

@@ -44,8 +44,20 @@ export class TestEntity extends VendureEntity implements Translatable {
     date: Date;
 
     @Calculated({
-        query: qb => qb.addSelect('description', 'description'),
-        expression: 'LENGTH(description)',
+        query: qb =>
+            qb
+                .leftJoin(
+                    qb1 => {
+                        return qb1
+                            .from(TestEntity, 'entity')
+                            .select('LENGTH(entity.description)', 'deslen')
+                            .addSelect('entity.id', 'eid');
+                    },
+                    't1',
+                    't1.eid = testentity.id',
+                )
+                .addSelect('t1.deslen', 'deslen'),
+        expression: 'deslen',
     })
     get descriptionLength() {
         return this.description.length || 0;

+ 15 - 13
packages/core/e2e/order.e2e-spec.ts

@@ -5,6 +5,7 @@ import {
     defaultShippingCalculator,
     defaultShippingEligibilityChecker,
     manualFulfillmentHandler,
+    mergeConfig,
 } from '@vendure/core';
 import {
     createErrorResultGuard,
@@ -16,7 +17,7 @@ import gql from 'graphql-tag';
 import path from 'path';
 
 import { initialData } from '../../../e2e-common/e2e-initial-data';
-import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
+import { TEST_SETUP_TIMEOUT_MS, testConfig } from '../../../e2e-common/test-config';
 
 import {
     failsToSettlePaymentMethod,
@@ -82,9 +83,9 @@ import {
     DELETE_SHIPPING_METHOD,
     GET_CUSTOMER_LIST,
     GET_ORDER,
-    GET_ORDERS_LIST,
     GET_ORDER_FULFILLMENTS,
     GET_ORDER_HISTORY,
+    GET_ORDERS_LIST,
     GET_PRODUCT_WITH_VARIANTS,
     GET_STOCK_MOVEMENT,
     SETTLE_PAYMENT,
@@ -104,17 +105,18 @@ import { assertThrowsWithMessage } from './utils/assert-throws-with-message';
 import { addPaymentToOrder, proceedToArrangingPayment, sortById } from './utils/test-order-utils';
 
 describe('Orders resolver', () => {
-    const { server, adminClient, shopClient } = createTestEnvironment({
-        ...testConfig,
-        paymentOptions: {
-            paymentMethodHandlers: [
-                twoStagePaymentMethod,
-                failsToSettlePaymentMethod,
-                singleStageRefundablePaymentMethod,
-                partialPaymentMethod,
-            ],
-        },
-    });
+    const { server, adminClient, shopClient } = createTestEnvironment(
+        mergeConfig(testConfig, {
+            paymentOptions: {
+                paymentMethodHandlers: [
+                    twoStagePaymentMethod,
+                    failsToSettlePaymentMethod,
+                    singleStageRefundablePaymentMethod,
+                    partialPaymentMethod,
+                ],
+            },
+        }),
+    );
     let customers: GetCustomerList.Items[];
     const password = 'test';
 

+ 30 - 3
packages/core/src/entity/order/order.entity.ts

@@ -137,14 +137,41 @@ export class Order extends VendureEntity implements ChannelAware, HasCustomField
     }
 
     @Calculated({
-        query: qb => qb.addSelect('shipping', 'shipping'),
-        expression: 'subTotal + shipping',
+        query: qb =>
+            qb
+                .leftJoin(
+                    qb1 => {
+                        return qb1
+                            .from(Order, 'order')
+                            .select('order.shipping + order.subTotal', 'total')
+                            .addSelect('order.id', 'oid');
+                    },
+                    't1',
+                    't1.oid = order.id',
+                )
+                .addSelect('t1.total', 'total'),
+        expression: 'total',
     })
     get total(): number {
         return this.subTotal + (this.shipping || 0);
     }
 
-    @Calculated({ expression: 'subTotalWithTax + shippingWithTax' })
+    @Calculated({
+        query: qb =>
+            qb
+                .leftJoin(
+                    qb1 => {
+                        return qb1
+                            .from(Order, 'order')
+                            .select('order.shippingWithTax + order.subTotalWithTax', 'twt')
+                            .addSelect('order.id', 'oid');
+                    },
+                    't1',
+                    't1.oid = order.id',
+                )
+                .addSelect('t1.twt', 'twt'),
+        expression: 'twt',
+    })
     get totalWithTax(): number {
         return this.subTotalWithTax + (this.shippingWithTax || 0);
     }