@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.
- package/index.js +47 -30
- 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) => (
|
|
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,32 @@ 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 (
|
|
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
|
-
|
|
130
|
-
|
|
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": "
|
|
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": ">=
|
|
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.
|
|
48
|
-
"@types/mocha": "^10.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.
|
|
52
|
-
"eslint-config-prettier": "^8.
|
|
50
|
+
"eslint": "^8.43.0",
|
|
51
|
+
"eslint-config-prettier": "^8.8.0",
|
|
53
52
|
"eslint-plugin-prettier": "^4.2.1",
|
|
54
|
-
"mocha": "^10.
|
|
55
|
-
"nock": "^13.
|
|
53
|
+
"mocha": "^10.2.0",
|
|
54
|
+
"nock": "^13.3.1",
|
|
56
55
|
"pre-commit": "^1.2.2",
|
|
57
|
-
"prettier": "^2.
|
|
56
|
+
"prettier": "^2.8.8"
|
|
58
57
|
}
|
|
59
58
|
}
|