@florajs/datasource-solr 4.0.0 → 5.0.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.
Files changed (2) hide show
  1. package/index.js +43 -30
  2. package/package.json +3 -4
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,28 @@ 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 rangeOperators.includes(operator1) && rangeOperators.includes(operator2);
68
+ });
63
69
 
64
70
  if (!rangeQueries.length) return filters;
65
71
 
@@ -126,12 +132,19 @@ function convertFilterToSolrSyntax(filter) {
126
132
  if (!Array.isArray(filter.attribute)) {
127
133
  value = escapeValueForSolr(value);
128
134
  if (Array.isArray(value)) {
129
- if (operator === 'range') value = '[' + value[0] + ' TO ' + value[1] + ']';
130
- else value = '(' + value.join(' OR ') + ')';
135
+ const lowerSolrRangeOperator = filter.lowerSolrRangeOperator || '[';
136
+ const upperSolrRangeOperator = filter.upperSolrRangeOperator || ']';
137
+
138
+ value =
139
+ operator === 'range'
140
+ ? lowerSolrRangeOperator + value[0] + ' TO ' + value[1] + upperSolrRangeOperator
141
+ : '(' + value.join(' OR ') + ')';
131
142
  }
132
143
 
133
144
  if (operator !== 'notEqual') {
145
+ if (operator === 'greater') value = '{' + value + ' TO *]';
134
146
  if (operator === 'greaterOrEqual') value = '[' + value + ' TO *]';
147
+ if (operator === 'less') value = '[* TO ' + value + '}';
135
148
  if (operator === 'lessOrEqual') value = '[* TO ' + value + ']';
136
149
  return filter.attribute + ':' + value;
137
150
  }
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.0",
4
4
  "description": "Solr connection for Flora",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -37,11 +37,10 @@
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
46
  "@types/chai": "^4.3.4",