@mikro-orm/core 6.4.17-dev.76 → 6.4.17-dev.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/core",
3
- "version": "6.4.17-dev.76",
3
+ "version": "6.4.17-dev.78",
4
4
  "description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",
@@ -64,7 +64,7 @@
64
64
  "esprima": "4.0.1",
65
65
  "fs-extra": "11.3.1",
66
66
  "globby": "11.1.0",
67
- "mikro-orm": "6.4.17-dev.76",
67
+ "mikro-orm": "6.4.17-dev.78",
68
68
  "reflect-metadata": "0.2.2"
69
69
  }
70
70
  }
@@ -1,10 +1,16 @@
1
1
  import type { Dictionary, EntityMetadata, EntityProperty, FilterDef, FilterQuery } from '../typings';
2
2
  import type { Platform } from '../platforms';
3
3
  import type { MetadataStorage } from '../metadata/MetadataStorage';
4
+ /** @internal */
4
5
  export declare class QueryHelper {
5
6
  static readonly SUPPORTED_OPERATORS: string[];
6
7
  static processParams(params: unknown): any;
7
8
  static processObjectParams<T extends object>(params?: T): T;
9
+ /**
10
+ * converts `{ account: { $or: [ [Object], [Object] ] } }`
11
+ * to `{ $or: [ { account: [Object] }, { account: [Object] } ] }`
12
+ */
13
+ static liftGroupOperators<T extends object>(where: Dictionary, meta: EntityMetadata<T>, metadata: MetadataStorage, key?: string): string | undefined;
8
14
  static inlinePrimaryKeyObjects<T extends object>(where: Dictionary, meta: EntityMetadata<T>, metadata: MetadataStorage, key?: string): boolean;
9
15
  static processWhere<T extends object>(options: ProcessWhereOptions<T>): FilterQuery<T>;
10
16
  static getActiveFilters(entityName: string, options: Dictionary<boolean | Dictionary> | string[] | boolean, filters: Dictionary<FilterDef>): FilterDef[];
@@ -7,6 +7,7 @@ const enums_1 = require("../enums");
7
7
  const JsonType_1 = require("../types/JsonType");
8
8
  const wrap_1 = require("../entity/wrap");
9
9
  const RawQueryFragment_1 = require("./RawQueryFragment");
10
+ /** @internal */
10
11
  class QueryHelper {
11
12
  static SUPPORTED_OPERATORS = ['>', '<', '<=', '>=', '!', '!='];
12
13
  static processParams(params) {
@@ -36,6 +37,47 @@ class QueryHelper {
36
37
  });
37
38
  return params;
38
39
  }
40
+ /**
41
+ * converts `{ account: { $or: [ [Object], [Object] ] } }`
42
+ * to `{ $or: [ { account: [Object] }, { account: [Object] } ] }`
43
+ */
44
+ static liftGroupOperators(where, meta, metadata, key) {
45
+ if (!Utils_1.Utils.isPlainObject(where)) {
46
+ return undefined;
47
+ }
48
+ const keys = Object.keys(where);
49
+ const groupOperator = keys.find(k => {
50
+ return Utils_1.Utils.isGroupOperator(k) && Array.isArray(where[k]) && where[k].every(cond => {
51
+ return Utils_1.Utils.isPlainObject(cond) && Object.keys(cond).every(k2 => {
52
+ if (Utils_1.Utils.isOperator(k2, false)) {
53
+ if (k2 === '$not') {
54
+ return Object.keys(cond[k2]).every(k3 => meta.primaryKeys.includes(k3));
55
+ }
56
+ return true;
57
+ }
58
+ return meta.primaryKeys.includes(k2);
59
+ });
60
+ });
61
+ });
62
+ if (groupOperator) {
63
+ return groupOperator;
64
+ }
65
+ for (const k of keys) {
66
+ const value = where[k];
67
+ const prop = meta.properties[k];
68
+ if (!prop || ![enums_1.ReferenceKind.MANY_TO_ONE, enums_1.ReferenceKind.ONE_TO_ONE].includes(prop.kind)) {
69
+ continue;
70
+ }
71
+ const op = this.liftGroupOperators(value, prop.targetMeta, metadata, k);
72
+ if (op) {
73
+ delete where[k];
74
+ where[op] = value[op].map((v) => {
75
+ return { [k]: v };
76
+ });
77
+ }
78
+ }
79
+ return undefined;
80
+ }
39
81
  static inlinePrimaryKeyObjects(where, meta, metadata, key) {
40
82
  if (Array.isArray(where)) {
41
83
  where.forEach((item, i) => {
@@ -50,7 +92,7 @@ class QueryHelper {
50
92
  if (meta.primaryKeys.every(pk => pk in where) && Utils_1.Utils.getObjectKeysSize(where) === meta.primaryKeys.length) {
51
93
  return !!key && !enums_1.GroupOperator[key] && key !== '$not' && Object.keys(where).every(k => !Utils_1.Utils.isPlainObject(where[k]) || Object.keys(where[k]).every(v => {
52
94
  if (Utils_1.Utils.isOperator(v, false)) {
53
- return false;
95
+ return true;
54
96
  }
55
97
  if (meta.properties[k].primary && [enums_1.ReferenceKind.ONE_TO_ONE, enums_1.ReferenceKind.MANY_TO_ONE].includes(meta.properties[k].kind)) {
56
98
  return this.inlinePrimaryKeyObjects(where[k], meta.properties[k].targetMeta, metadata, v);
@@ -72,6 +114,7 @@ class QueryHelper {
72
114
  const meta = metadata.find(entityName);
73
115
  // inline PK-only objects in M:N queries, so we don't join the target entity when not needed
74
116
  if (meta && root) {
117
+ QueryHelper.liftGroupOperators(where, meta, metadata);
75
118
  QueryHelper.inlinePrimaryKeyObjects(where, meta, metadata);
76
119
  }
77
120
  if (options.platform.getConfig().get('ignoreUndefinedInQuery') && where && typeof where === 'object') {