@florajs/datasource-solr 4.0.0 → 5.0.1

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.
Files changed (2) hide show
  1. package/index.js +47 -30
  2. package/package.json +10 -11
package/index.js CHANGED
@@ -3,30 +3,18 @@
3
3
  const http = require('http');
4
4
  const querystring = require('querystring');
5
5
 
6
- const _ = require('lodash');
7
6
  const { ImplementationError } = require('@florajs/errors');
8
7
 
9
- const SUPPORTED_FILTERS = ['equal', 'notEqual', 'lessOrEqual', 'greaterOrEqual', 'range'];
8
+ const SUPPORTED_FILTERS = ['equal', 'notEqual', 'less', 'lessOrEqual', 'greater', 'greaterOrEqual', 'range'];
9
+ const RANGE_OPERATOR_FILTER_MAPPING = {
10
+ less: '}',
11
+ lessOrEqual: ']',
12
+ greater: '{',
13
+ greaterOrEqual: '['
14
+ };
10
15
 
11
16
  const NO_LIMIT = 1000000;
12
17
 
13
- /**
14
- * Return true if two filters on same attribute can be used as single range filter.
15
- *
16
- * @param {Array.<Object>} filters
17
- * @return {boolean}
18
- * @private
19
- */
20
- function filterRangeQueries(filters) {
21
- if (filters.length !== 2) return false;
22
-
23
- const rangeOperators = ['lessOrEqual', 'greaterOrEqual'];
24
- const operator1 = filters[0].operator;
25
- const operator2 = filters[1].operator;
26
-
27
- return rangeOperators.includes(operator1) && rangeOperators.includes(operator2);
28
- }
29
-
30
18
  /**
31
19
  * Create range filter from a greatOrEqual and lessOrEqual filter.
32
20
  *
@@ -35,13 +23,16 @@ function filterRangeQueries(filters) {
35
23
  * @private
36
24
  */
37
25
  function createRangeFilter(attributeFilters) {
38
- const rangeFilter = { attribute: attributeFilters[0].attribute, operator: 'range' };
39
-
40
26
  // make sure greaterOrEqual filter comes first
41
- attributeFilters.sort((filter) => (filter.operator === 'greaterOrEqual' ? -1 : 1));
42
-
43
- rangeFilter.value = [attributeFilters[0].value, attributeFilters[1].value];
44
- return rangeFilter;
27
+ attributeFilters.sort((filter) => (['greater', 'greaterOrEqual'].includes(filter.operator) ? -1 : 1));
28
+
29
+ return {
30
+ attribute: attributeFilters[0].attribute,
31
+ operator: 'range',
32
+ lowerSolrRangeOperator: RANGE_OPERATOR_FILTER_MAPPING[attributeFilters[0].operator],
33
+ upperSolrRangeOperator: RANGE_OPERATOR_FILTER_MAPPING[attributeFilters[1].operator],
34
+ value: [attributeFilters[0].value, attributeFilters[1].value]
35
+ };
45
36
  }
46
37
 
47
38
  /**
@@ -53,13 +44,32 @@ function createRangeFilter(attributeFilters) {
53
44
  * @private
54
45
  */
55
46
  function rangify(filters) {
56
- const hasRangeableFilters = filters.some((filter) => ['lessOrEqual', 'greaterOrEqual'].includes(filter.operator));
47
+ const hasRangeableFilters = filters.some((filter) =>
48
+ ['less', 'lessOrEqual', 'greater', 'greaterOrEqual'].includes(filter.operator)
49
+ );
50
+
57
51
  if (!hasRangeableFilters) {
58
52
  return filters;
59
53
  }
60
54
 
61
- const groupedAttrs = _.groupBy(filters, 'attribute');
62
- const rangeQueries = _.filter(groupedAttrs, filterRangeQueries);
55
+ const groupedAttrs = filters.reduce((acc, filter) => {
56
+ acc[filter.attribute] = acc[filter.attribute] || [];
57
+ acc[filter.attribute].push(filter);
58
+ return acc;
59
+ }, {});
60
+ const rangeQueries = Object.values(groupedAttrs).filter((filters) => {
61
+ if (filters.length !== 2) return false;
62
+
63
+ const rangeOperators = ['less', 'lessOrEqual', 'greater', 'greaterOrEqual'];
64
+ const operator1 = filters[0].operator;
65
+ const operator2 = filters[1].operator;
66
+
67
+ return (
68
+ rangeOperators.includes(operator1) &&
69
+ rangeOperators.includes(operator2) &&
70
+ operator1.substring(0, 4) !== operator2.substring(0, 4)
71
+ );
72
+ });
63
73
 
64
74
  if (!rangeQueries.length) return filters;
65
75
 
@@ -126,12 +136,19 @@ function convertFilterToSolrSyntax(filter) {
126
136
  if (!Array.isArray(filter.attribute)) {
127
137
  value = escapeValueForSolr(value);
128
138
  if (Array.isArray(value)) {
129
- if (operator === 'range') value = '[' + value[0] + ' TO ' + value[1] + ']';
130
- else value = '(' + value.join(' OR ') + ')';
139
+ const lowerSolrRangeOperator = filter.lowerSolrRangeOperator || '[';
140
+ const upperSolrRangeOperator = filter.upperSolrRangeOperator || ']';
141
+
142
+ value =
143
+ operator === 'range'
144
+ ? lowerSolrRangeOperator + value[0] + ' TO ' + value[1] + upperSolrRangeOperator
145
+ : '(' + value.join(' OR ') + ')';
131
146
  }
132
147
 
133
148
  if (operator !== 'notEqual') {
149
+ if (operator === 'greater') value = '{' + value + ' TO *]';
134
150
  if (operator === 'greaterOrEqual') value = '[' + value + ' TO *]';
151
+ if (operator === 'less') value = '[* TO ' + value + '}';
135
152
  if (operator === 'lessOrEqual') value = '[* TO ' + value + ']';
136
153
  return filter.attribute + ':' + value;
137
154
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@florajs/datasource-solr",
3
- "version": "4.0.0",
3
+ "version": "5.0.1",
4
4
  "description": "Solr connection for Flora",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -37,23 +37,22 @@
37
37
  }
38
38
  ],
39
39
  "engines": {
40
- "node": ">=14"
40
+ "node": ">=16"
41
41
  },
42
42
  "dependencies": {
43
- "@florajs/errors": "^3.0.0",
44
- "lodash": "^4.17.21"
43
+ "@florajs/errors": "^3.0.0"
45
44
  },
46
45
  "devDependencies": {
47
- "@types/chai": "^4.3.4",
48
- "@types/mocha": "^10.0.0",
46
+ "@types/chai": "^4.3.5",
47
+ "@types/mocha": "^10.0.1",
49
48
  "@types/nock": "^11.1.0",
50
49
  "chai": "^4.3.7",
51
- "eslint": "^8.27.0",
52
- "eslint-config-prettier": "^8.5.0",
50
+ "eslint": "^8.43.0",
51
+ "eslint-config-prettier": "^8.8.0",
53
52
  "eslint-plugin-prettier": "^4.2.1",
54
- "mocha": "^10.1.0",
55
- "nock": "^13.2.9",
53
+ "mocha": "^10.2.0",
54
+ "nock": "^13.3.1",
56
55
  "pre-commit": "^1.2.2",
57
- "prettier": "^2.7.1"
56
+ "prettier": "^2.8.8"
58
57
  }
59
58
  }