@appland/scanner 1.53.0 → 1.54.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [@appland/scanner-v1.54.0](https://github.com/applandinc/appmap-js/compare/@appland/scanner-v1.53.0...@appland/scanner-v1.54.0) (2022-05-03)
2
+
3
+
4
+ ### Features
5
+
6
+ * N+1 queries must have the same common ancestor ([7edb88b](https://github.com/applandinc/appmap-js/commit/7edb88b3dc3938e9edc718b8279e980abbc06423))
7
+
1
8
  # [@appland/scanner-v1.53.0](https://github.com/applandinc/appmap-js/compare/@appland/scanner-v1.52.5...@appland/scanner-v1.53.0) (2022-05-02)
2
9
 
3
10
 
@@ -10,6 +10,31 @@ var __values = (this && this.__values) || function(o) {
10
10
  };
11
11
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
12
  };
13
+ var __read = (this && this.__read) || function (o, n) {
14
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
15
+ if (!m) return o;
16
+ var i = m.call(o), r, ar = [], e;
17
+ try {
18
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
19
+ }
20
+ catch (error) { e = { error: error }; }
21
+ finally {
22
+ try {
23
+ if (r && !r.done && (m = i["return"])) m.call(i);
24
+ }
25
+ finally { if (e) throw e.error; }
26
+ }
27
+ return ar;
28
+ };
29
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
30
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
31
+ if (ar || !(i in from)) {
32
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
33
+ ar[i] = from[i];
34
+ }
35
+ }
36
+ return to.concat(ar || Array.prototype.slice.call(from));
37
+ };
13
38
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
40
  };
@@ -24,55 +49,76 @@ var Options = /** @class */ (function () {
24
49
  }
25
50
  return Options;
26
51
  }());
27
- // TODO: clean up according to https://github.com/applandinc/scanner/issues/43
28
52
  function build(options) {
29
- var sqlCount = {};
30
53
  function matcher(command, appMapIndex, eventFilter) {
31
54
  var e_1, _a;
55
+ var sqlEvents = (0, database_1.sqlStrings)(command, appMapIndex, eventFilter);
56
+ var sqlRollup = {};
57
+ var eventsById = {};
58
+ appMapIndex.appMap.events.forEach(function (event) {
59
+ eventsById[event.id] = event;
60
+ });
32
61
  try {
33
- for (var _b = __values((0, database_1.sqlStrings)(command, appMapIndex, eventFilter)), _c = _b.next(); !_c.done; _c = _b.next()) {
34
- var sqlEvent = _c.value;
35
- var occurrence = sqlCount[sqlEvent.sql];
36
- if (!occurrence) {
37
- occurrence = {
38
- count: 1,
39
- events: [sqlEvent.event],
40
- };
41
- sqlCount[sqlEvent.sql] = occurrence;
42
- }
43
- else {
44
- occurrence.count += 1;
45
- occurrence.events.push(sqlEvent.event);
46
- }
62
+ for (var sqlEvents_1 = __values(sqlEvents), sqlEvents_1_1 = sqlEvents_1.next(); !sqlEvents_1_1.done; sqlEvents_1_1 = sqlEvents_1.next()) {
63
+ var sqlEvent = sqlEvents_1_1.value;
64
+ if (!sqlEvent.event.parent)
65
+ continue;
66
+ var key = [sqlEvent.event.parent.id, sqlEvent.sql].join('\n');
67
+ sqlRollup[key] || (sqlRollup[key] = []);
68
+ sqlRollup[key].push(sqlEvent);
47
69
  }
48
70
  }
49
71
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
50
72
  finally {
51
73
  try {
52
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
74
+ if (sqlEvents_1_1 && !sqlEvents_1_1.done && (_a = sqlEvents_1.return)) _a.call(sqlEvents_1);
53
75
  }
54
76
  finally { if (e_1) throw e_1.error; }
55
77
  }
56
- return Object.keys(sqlCount).reduce(function (matchResults, sql) {
57
- var occurrence = sqlCount[sql];
58
- var buildMatchResult = function (level) {
59
- return {
60
- level: level,
61
- event: occurrence.events[0],
62
- message: "".concat(occurrence.count, " occurrences of SQL: ").concat(sql),
63
- groupMessage: sql,
64
- occurranceCount: occurrence.count,
65
- relatedEvents: occurrence.events,
66
- };
67
- };
68
- if (occurrence.count >= options.errorLimit) {
69
- matchResults.push(buildMatchResult('error'));
70
- }
71
- else if (occurrence.count >= options.warningLimit) {
72
- matchResults.push(buildMatchResult('warning'));
73
- }
74
- return matchResults;
75
- }, []);
78
+ var matchResults = [];
79
+ var _loop_1 = function () {
80
+ __spreadArray([], __read(Object.keys(sqlRollup)), false).forEach(function (key) {
81
+ var events = sqlRollup[key];
82
+ var _a = __read(key.split('\n'), 2), ancestorId = _a[0], sql = _a[1];
83
+ var ancestor = eventsById[parseInt(ancestorId)];
84
+ var occurranceCount = events.length;
85
+ if (occurranceCount > options.warningLimit) {
86
+ var buildMatchResult = function (level) {
87
+ return {
88
+ level: level,
89
+ event: events[0].event,
90
+ message: "".concat(ancestor.toString(), "[").concat(ancestor.id, "] contains ").concat(occurranceCount, " occurrences of SQL: ").concat(sql),
91
+ groupMessage: sql,
92
+ occurranceCount: occurranceCount,
93
+ relatedEvents: events.map(function (e) { return e.event; }),
94
+ };
95
+ };
96
+ if (occurranceCount >= options.errorLimit) {
97
+ matchResults.push(buildMatchResult('error'));
98
+ }
99
+ else if (occurranceCount >= options.warningLimit) {
100
+ matchResults.push(buildMatchResult('warning'));
101
+ }
102
+ }
103
+ });
104
+ var newRollup = {};
105
+ Object.keys(sqlRollup).forEach(function (key) {
106
+ var events = sqlRollup[key];
107
+ if (events.length >= options.warningLimit)
108
+ return;
109
+ var _a = __read(key.split('\n'), 2), ancestorId = _a[0], sql = _a[1];
110
+ var ancestor = eventsById[parseInt(ancestorId)];
111
+ if (ancestor.parent) {
112
+ var parentKey = [ancestor.parent.id, sql].join('\n');
113
+ newRollup[parentKey] = (newRollup[parentKey] || []).concat(events);
114
+ }
115
+ }, {});
116
+ sqlRollup = newRollup;
117
+ };
118
+ do {
119
+ _loop_1();
120
+ } while (Object.keys(sqlRollup).length > 0);
121
+ return matchResults;
76
122
  }
77
123
  return {
78
124
  matcher: matcher,
@@ -1 +1 @@
1
- {"version":3,"file":"nPlusOneQuery.js","sourceRoot":"","sources":["../../src/rules/nPlusOneQuery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,wCAAmD;AACnD,2BAA0B;AAC1B,oFAA8D;AAE9D;IAAA;QACS,iBAAY,GAAG,CAAC,CAAC;QACjB,eAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAAD,cAAC;AAAD,CAAC,AAHD,IAGC;AAED,8EAA8E;AAC9E,SAAS,KAAK,CAAC,OAAgB;IAC7B,IAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,SAAS,OAAO,CACd,OAAc,EACd,WAAwB,EACxB,WAAwB;;;YAExB,KAAuB,IAAA,KAAA,SAAA,IAAA,qBAAU,EAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA,gBAAA,4BAAE;gBAAjE,IAAM,QAAQ,WAAA;gBACjB,IAAI,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU,EAAE;oBACf,UAAU,GAAG;wBACX,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;qBACzB,CAAC;oBACF,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;iBACrC;qBAAM;oBACL,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;oBACtB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBACxC;aACF;;;;;;;;;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAC,YAAY,EAAE,GAAG;YACpD,IAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAM,gBAAgB,GAAG,UAAC,KAAY;gBACpC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC3B,OAAO,EAAE,UAAG,UAAU,CAAC,KAAK,kCAAwB,GAAG,CAAE;oBACzD,YAAY,EAAE,GAAG;oBACjB,eAAe,EAAE,UAAU,CAAC,KAAK;oBACjC,aAAa,EAAE,UAAU,CAAC,MAAM;iBACjC,CAAC;YACJ,CAAC,CAAC;YAEF,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE;gBAC1C,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;aAC9C;iBAAM,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE;gBACnD,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;aAChD;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,EAAE,EAAmB,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,SAAA;KACR,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE,SAAS;IAChB,YAAY,EAAE,aAAa;IAC3B,cAAc,EAAE,KAAK;IACrB,OAAO,SAAA;IACP,UAAU,EAAE;QACV,UAAU,EAAE,IAAI,SAAG,CAAC,kDAAkD,CAAC;KACxE;IACD,WAAW,EAAE,IAAA,8BAAoB,EAAC,eAAe,CAAC;IAClD,GAAG,EAAE,yEAAyE;IAC9E,KAAK,OAAA;CACE,CAAC"}
1
+ {"version":3,"file":"nPlusOneQuery.js","sourceRoot":"","sources":["../../src/rules/nPlusOneQuery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,wCAAmD;AACnD,2BAA0B;AAC1B,oFAA8D;AAE9D;IAAA;QACS,iBAAY,GAAG,CAAC,CAAC;QACjB,eAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IAAD,cAAC;AAAD,CAAC,AAHD,IAGC;AAED,SAAS,KAAK,CAAC,OAAgB;IAC7B,SAAS,OAAO,CACd,OAAc,EACd,WAAwB,EACxB,WAAwB;;QAExB,IAAM,SAAS,GAAG,IAAA,qBAAU,EAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAEhE,IAAI,SAAS,GAA+B,EAAE,CAAC;QAC/C,IAAM,UAAU,GAA0B,EAAE,CAAC;QAC7C,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAC,KAAK;YACtC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC,CAAC,CAAC;;YAEH,KAAuB,IAAA,cAAA,SAAA,SAAS,CAAA,oCAAA,2DAAE;gBAA7B,IAAM,QAAQ,sBAAA;gBACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM;oBAAE,SAAS;gBAErC,IAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,SAAS,CAAC,GAAG,MAAb,SAAS,CAAC,GAAG,IAAM,EAAE,EAAC;gBACtB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/B;;;;;;;;;QAED,IAAM,YAAY,GAAkB,EAAE,CAAC;;YAErC,yBAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAE,OAAO,CAAC,UAAC,GAAG;gBACtC,IAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAA,KAAA,OAAoB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,EAAlC,UAAU,QAAA,EAAE,GAAG,QAAmB,CAAC;gBAC1C,IAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAE,CAAC;gBACnD,IAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;gBACtC,IAAI,eAAe,GAAG,OAAO,CAAC,YAAY,EAAE;oBAC1C,IAAM,gBAAgB,GAAG,UAAC,KAAY;wBACpC,OAAO;4BACL,KAAK,EAAE,KAAK;4BACZ,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;4BACtB,OAAO,EAAE,UAAG,QAAQ,CAAC,QAAQ,EAAE,cAC7B,QAAQ,CAAC,EAAE,wBACC,eAAe,kCAAwB,GAAG,CAAE;4BAC1D,YAAY,EAAE,GAAG;4BACjB,eAAe,EAAE,eAAe;4BAChC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,EAAP,CAAO,CAAC;yBAC1C,CAAC;oBACJ,CAAC,CAAC;oBAEF,IAAI,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;wBACzC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;qBAC9C;yBAAM,IAAI,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE;wBAClD,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;qBAChD;iBACF;YACH,CAAC,CAAC,CAAC;YAEH,IAAM,SAAS,GAA+B,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;gBACjC,IAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,YAAY;oBAAE,OAAO;gBAE5C,IAAA,KAAA,OAAoB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,EAAlC,UAAU,QAAA,EAAE,GAAG,QAAmB,CAAC;gBAC1C,IAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAE,CAAC;gBACnD,IAAI,QAAQ,CAAC,MAAM,EAAE;oBACnB,IAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvD,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;iBACpE;YACH,CAAC,EAAE,EAAgC,CAAC,CAAC;YACrC,SAAS,GAAG,SAAS,CAAC;;QAxCxB;;iBAyCS,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAE5C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO;QACL,OAAO,SAAA;KACR,CAAC;AACJ,CAAC;AAED,kBAAe;IACb,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE,SAAS;IAChB,YAAY,EAAE,aAAa;IAC3B,cAAc,EAAE,KAAK;IACrB,OAAO,SAAA;IACP,UAAU,EAAE;QACV,UAAU,EAAE,IAAI,SAAG,CAAC,kDAAkD,CAAC;KACxE;IACD,WAAW,EAAE,IAAA,8BAAoB,EAAC,eAAe,CAAC;IAClD,GAAG,EAAE,yEAAyE;IAC9E,KAAK,OAAA;CACE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appland/scanner",
3
- "version": "1.53.0",
3
+ "version": "1.54.0",
4
4
  "description": "",
5
5
  "bin": "built/cli.js",
6
6
  "files": [