adminmate-express-mongoose 1.3.11 → 1.3.12

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": "adminmate-express-mongoose",
3
- "version": "1.3.11",
3
+ "version": "1.3.12",
4
4
  "description": "Adminmate Express/Mongoose connector",
5
5
  "author": "Marc Delalonde",
6
6
  "homepage": "http://adminmate.io",
@@ -87,10 +87,12 @@ module.exports = _conf => {
87
87
  const parentIds = repartitionData.map(d => d.key);
88
88
  const parentData = await currentModel.find({ _id: parentIds }).select(data.field).lean();
89
89
 
90
+ const parentMap = new Map(parentData.map(p => [p._id.toString(), p]));
91
+
90
92
  repartitionData.forEach(d => {
91
93
  d.item_model = data.model;
92
94
  d.item_id = d.key;
93
- const parent = parentData.find(p => p._id.toString() === d.key.toString());
95
+ const parent = parentMap.get(d.key.toString());
94
96
  if (parent) {
95
97
  d.key = parent[data.field];
96
98
  }
@@ -115,16 +115,23 @@ module.exports = _conf => {
115
115
  if (repartitionData && repartitionData.length > 0) {
116
116
  // Get min & max date in the results
117
117
  const momentFormat = data.timeframe === 'week' ? 'YYYY-WW' : 'YYYY-MM-DD HH:mm:ss';
118
- const unixRange = repartitionData.map(data => moment(data.key, momentFormat));
118
+ const unixRange = repartitionData.map(d => moment(d.key, momentFormat));
119
119
  const min = _.min(unixRange).clone();
120
120
  const max = _.max(unixRange).clone();
121
121
 
122
+ // Pre-build a map keyed by formatted date to avoid O(n²) lookup
123
+ const dataMap = new Map(repartitionData.map(d => {
124
+ const key = moment(d.key, momentFormat).startOf(data.timeframe).format('YYYY-MM-DD');
125
+ return [key, d.value];
126
+ }));
127
+
122
128
  let currentDate = min;
123
129
  while (currentDate.isSameOrBefore(max)) {
124
- const countForTheTimeframe = repartitionData.find(d => moment(d.key, momentFormat).isSame(currentDate, data.timeframe));
125
- const value = countForTheTimeframe ? fnHelper.toFixedIfNecessary(countForTheTimeframe.value, 2) : 0;
130
+ const dateKey = currentDate.format('YYYY-MM-DD');
131
+ const matchingValue = dataMap.get(dateKey);
132
+ const value = matchingValue !== undefined ? fnHelper.toFixedIfNecessary(matchingValue, 2) : 0;
126
133
  formattedData.push({
127
- key: currentDate.format('YYYY-MM-DD'),
134
+ key: dateKey,
128
135
  value
129
136
  });
130
137
  currentDate.add(1, data.timeframe).startOf('day');
@@ -102,7 +102,9 @@ module.exports = _conf => {
102
102
  }
103
103
 
104
104
  // Simple count
105
- const dataCount = await currentModel.countDocuments(findParams);
105
+ const dataCount = Object.keys(findParams).length
106
+ ? await currentModel.countDocuments(findParams)
107
+ : await currentModel.estimatedDocumentCount();
106
108
 
107
109
  return {
108
110
  success: true,