From b926118e84f245dd7e73a604a5a0713daa1fbe9f Mon Sep 17 00:00:00 2001 From: Denis Bykhov <80476319+BykhovDenis@users.noreply.github.com> Date: Wed, 8 Dec 2021 15:14:55 +0600 Subject: [PATCH] Sorting (#567) Signed-off-by: Denis Bykhov --- common/config/rush/pnpm-lock.yaml | 15 ++++++++------- dev/tool/package.json | 3 ++- packages/core/src/memdb.ts | 4 ++-- packages/core/src/query.ts | 10 +++++++++- plugins/view-resources/src/index.ts | 2 +- server/mongo/src/storage.ts | 24 +++++++++++++++++++++--- 6 files changed, 43 insertions(+), 15 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 3258def3fc..df8890f16d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -9811,7 +9811,7 @@ packages: dev: false file:projects/contact-resources.tgz_476f694f64637160ae71e12ff57815b9: - resolution: {integrity: sha512-I563510HapGECL9TC1qo8OQsLhKaMl/ttdIWN6vL+XOPcJY+YnmLrMmo0UNMcbCo8liNfvrNmjgbnjpSdl2ikg==, tarball: file:projects/contact-resources.tgz} + resolution: {integrity: sha512-5aEH1fHFn/BbM8mJcS2gPNW9koEkNtX8P3uC+iEID5xQPUuJV5rsfba17/Iq2bYj5DeLkyvNO5wAwoECwVCvRA==, tarball: file:projects/contact-resources.tgz} id: file:projects/contact-resources.tgz name: '@rush-temp/contact-resources' version: 0.0.0 @@ -10140,7 +10140,7 @@ packages: dev: false file:projects/lead-resources.tgz_476f694f64637160ae71e12ff57815b9: - resolution: {integrity: sha512-JO4mPZzFqoE1LYtroNwlQAUPqc2nbyarfsVlsnAC0uX87jvl7HA78tCDVzuh8LHZfexY0ilrcu1Y0ItOymdT9g==, tarball: file:projects/lead-resources.tgz} + resolution: {integrity: sha512-o80Jqqi39oV9wTk/nhjlU53bHy92gsqqCQo1nWTsPLlMB+R1nYY5/Yw/GFxsuVHSzbzjmahUnkHIOxltJMSTig==, tarball: file:projects/lead-resources.tgz} id: file:projects/lead-resources.tgz name: '@rush-temp/lead-resources' version: 0.0.0 @@ -10407,7 +10407,7 @@ packages: dev: false file:projects/model-lead.tgz_typescript@4.4.3: - resolution: {integrity: sha512-uj6uS5KfwNIUxmSBOMO5fZT/OlT3JgXlo4OGEmg0LSGHRXUBI5nAkbLevY81kVQbtN3mKB7MPz1nLm09cxuhSw==, tarball: file:projects/model-lead.tgz} + resolution: {integrity: sha512-qEMZ6aUEiEZgFvIMcqR8lTVkKKiUNM4eAa5OeLjnDmY1TkFF60EJpnE0e2D1SzO8zPdS+cDH+jT9FqRvXtkO9A==, tarball: file:projects/model-lead.tgz} id: file:projects/model-lead.tgz name: '@rush-temp/model-lead' version: 0.0.0 @@ -10846,7 +10846,7 @@ packages: dev: false file:projects/prod.tgz_sass@1.42.1+typescript@4.4.3: - resolution: {integrity: sha512-BsM4OYUp0S0TI6LsvclxVQ0kG6U9Oj4gbGbD38jUPIy02pVP82bS2WrAWh7/s3H4j+sbUnmmrVRulaDAcw34rw==, tarball: file:projects/prod.tgz} + resolution: {integrity: sha512-EiXyXpntXiKwZYik5KcFitoFzvuRz3SaDN5fdwaB+IYXKXEk7Y+9Q/z8CWX4xpLZDBMDMQyTuj/fJRO2qxC52w==, tarball: file:projects/prod.tgz} id: file:projects/prod.tgz name: '@rush-temp/prod' version: 0.0.0 @@ -10920,7 +10920,7 @@ packages: dev: false file:projects/recruit-resources.tgz_476f694f64637160ae71e12ff57815b9: - resolution: {integrity: sha512-jJZMXXqVj+ovkyBhJrgToGioIbSmbf7otw3GrGcO/SuZ87j21EZHEY5vKaFAhuXDOriTz7UeajmGmUsx2H7okA==, tarball: file:projects/recruit-resources.tgz} + resolution: {integrity: sha512-V7iAy6fX/2McQ0gZjvzHL4qA4ETElxXHEBh6ZnXBuYE8ht0sqLIXSGdgJstxyR++MWTe5ZM7l4GS/re3zYGdnw==, tarball: file:projects/recruit-resources.tgz} id: file:projects/recruit-resources.tgz name: '@rush-temp/recruit-resources' version: 0.0.0 @@ -11241,7 +11241,7 @@ packages: dev: false file:projects/task-resources.tgz_e1367da94684b005adf08f025c517b1a: - resolution: {integrity: sha512-zueI7N0xsHL7n4RRTJzNqXaDvrdC/BgotXDMVEFz4TKTvJuwGZ/39TfLaLQM0b/AWvDJV3iG3WS0z9ZMbtHc2g==, tarball: file:projects/task-resources.tgz} + resolution: {integrity: sha512-8q7drsS3cuBhtj4PIl+/QIH8QDt0fZWk89fH3FxY/3Oog8Xd5dGkBH4YdPHUSyk9k5u9iS/P8OwvR9CKMBmxRg==, tarball: file:projects/task-resources.tgz} id: file:projects/task-resources.tgz name: '@rush-temp/task-resources' version: 0.0.0 @@ -11427,7 +11427,7 @@ packages: dev: false file:projects/tool.tgz: - resolution: {integrity: sha512-klTUXsaa1dlq4wR1u+u3vJ8Vh8Z+StBadUgTZ1r0aqYjVXx9npJFqF+PHucl2LbZ0gDeHqC7crbxfGuui9na1Q==, tarball: file:projects/tool.tgz} + resolution: {integrity: sha512-yYYJSLJDN7MZB9u4wzXJuUQfQdx3K5eJ1xtcuniq/NO7c2Am0tmCP5F64l7LyGc+kUQpOoj3vBl58H1tjtgJfw==, tarball: file:projects/tool.tgz} name: '@rush-temp/tool' version: 0.0.0 dependencies: @@ -11439,6 +11439,7 @@ packages: '@typescript-eslint/eslint-plugin': 5.4.0_87dbf04088b125598d0271706532eaf3 '@typescript-eslint/parser': 5.4.0_eslint@7.32.0+typescript@4.4.3 commander: 8.2.0 + cross-env: 7.0.3 esbuild: 0.12.29 eslint: 7.32.0 eslint-config-standard-with-typescript: 21.0.1_05a8ea1454e6ca4c9f98b94b8f3abf9c diff --git a/dev/tool/package.json b/dev/tool/package.json index b99b7aea50..a33d937afc 100644 --- a/dev/tool/package.json +++ b/dev/tool/package.json @@ -12,11 +12,12 @@ "bundle": "esbuild src/index.ts --bundle --minify --platform=node > bundle.js", "docker:build": "docker build -t anticrm/tool .", "docker:push": "docker push anticrm/tool", - "run-local": "MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin MONGO_URL=mongodb://localhost:27017 TRANSACTOR_URL=ws:/localhost:3333 MINIO_ENDPOINT=localhost TELEGRAM_DATABASE=telegram-service ts-node ./src/index.ts", + "run-local": "cross-env MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin MONGO_URL=mongodb://localhost:27017 TRANSACTOR_URL=ws:/localhost:3333 MINIO_ENDPOINT=localhost TELEGRAM_DATABASE=telegram-service ts-node ./src/index.ts", "lint": "eslint src", "format": "prettier --write src && eslint --fix src" }, "devDependencies": { + "cross-env": "^7.0.3", "@anticrm/platform-rig": "~0.6.0", "@types/heft-jest": "^1.0.2", "@typescript-eslint/eslint-plugin": "^5.4.0", diff --git a/packages/core/src/memdb.ts b/packages/core/src/memdb.ts index 19bfcbb51d..56cca715ef 100644 --- a/packages/core/src/memdb.ts +++ b/packages/core/src/memdb.ts @@ -114,10 +114,10 @@ export abstract class MemDb extends TxProcessor { result = findProperty(result, key, value) } - if (options?.sort !== undefined) resultSort(result, options?.sort) - if (options?.lookup !== undefined) result = this.lookup(result as T[], options.lookup) + if (options?.sort !== undefined) resultSort(result, options?.sort) + result = result.slice(0, options?.limit) return clone(result) as T[] } diff --git a/packages/core/src/query.ts b/packages/core/src/query.ts index c38ae3f21b..df02a69e73 100644 --- a/packages/core/src/query.ts +++ b/packages/core/src/query.ts @@ -75,7 +75,15 @@ function arrayOrValue (vv: any): any[] { export function resultSort (result: T[], sortOptions: SortingQuery): void { const sortFunc = (a: any, b: any): number => { for (const key in sortOptions) { - const result = typeof a[key] === 'string' ? a[key].localeCompare(b[key]) : a[key] - b[key] + let aValue = getNestedValue(key, a) + if (typeof aValue === 'object') { + aValue = JSON.stringify(aValue) + } + let bValue = getNestedValue(key, b) + if (typeof bValue === 'object') { + bValue = JSON.stringify(bValue) + } + const result = typeof aValue === 'string' ? aValue.localeCompare(bValue) : aValue - bValue if (result !== 0) return result * (sortOptions[key] as number) } return 0 diff --git a/plugins/view-resources/src/index.ts b/plugins/view-resources/src/index.ts index cc17aa6267..6a7c7122f8 100644 --- a/plugins/view-resources/src/index.ts +++ b/plugins/view-resources/src/index.ts @@ -41,7 +41,7 @@ function Delete (object: Doc): void { label: 'Delete object', message: 'Do you want to delete this object?' }, undefined, (result) => { - if (result !== undefined) { + if (result) { deleteObject(getClient(), object) } }) diff --git a/server/mongo/src/storage.ts b/server/mongo/src/storage.ts index 3598b5689e..15d4c19048 100644 --- a/server/mongo/src/storage.ts +++ b/server/mongo/src/storage.ts @@ -92,6 +92,23 @@ abstract class MongoAdapterBase extends TxProcessor { pipeline.push({ $lookup: step }) } } + if (options.sort !== undefined) { + const sort = {} as any + for (const _key in options.sort) { + let key = _key as string + if (_key.startsWith('$lookup.')) { + key = key.replace('$lookup.', '') + const keys = key.split('.') + keys[0] = keys[0] + '_lookup' + key = keys.join('.') + } + sort[key] = options.sort[_key] === SortingOrder.Ascending ? 1 : -1 + } + pipeline.push({ $sort: sort }) + } + if (options.limit !== undefined) { + pipeline.push({ $limit: options.limit }) + } const domain = this.hierarchy.getDomain(clazz) const cursor = this.db.collection(domain).aggregate(pipeline) const result = (await cursor.toArray()) as FindResult @@ -125,9 +142,7 @@ abstract class MongoAdapterBase extends TxProcessor { } const domain = this.hierarchy.getDomain(_class) let cursor = this.db.collection(domain).find(this.translateQuery(_class, query)) - if (options?.limit !== undefined) { - cursor = cursor.limit(options.limit) - } + if (options !== null && options !== undefined) { if (options.sort !== undefined) { const sort: Sort = {} @@ -137,6 +152,9 @@ abstract class MongoAdapterBase extends TxProcessor { } cursor = cursor.sort(sort) } + if (options.limit !== undefined) { + cursor = cursor.limit(options.limit) + } } return await cursor.toArray() }