@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.
- package/index.js +43 -30
- 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) => (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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) =>
|
|
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 =
|
|
62
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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": "
|
|
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": ">=
|
|
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",
|