@@ -29,10 +29,10 @@ public function canVisit(Criterion $criterion)
29
29
return
30
30
$ criterion instanceof Criterion \MapLocationDistance &&
31
31
($ criterion ->operator === Operator::LT ||
32
- $ criterion ->operator === Operator::LTE ||
33
- $ criterion ->operator === Operator::GT ||
34
- $ criterion ->operator === Operator::GTE ||
35
- $ criterion ->operator === Operator::BETWEEN );
32
+ $ criterion ->operator === Operator::LTE ||
33
+ $ criterion ->operator === Operator::GT ||
34
+ $ criterion ->operator === Operator::GTE ||
35
+ $ criterion ->operator === Operator::BETWEEN );
36
36
}
37
37
38
38
/**
@@ -47,15 +47,18 @@ public function canVisit(Criterion $criterion)
47
47
*/
48
48
public function visit (Criterion $ criterion , CriterionVisitor $ subVisitor = null )
49
49
{
50
- $ criterion ->value = (array )$ criterion ->value ;
51
-
52
- $ start = $ criterion ->value [0 ];
53
- $ end = isset ($ criterion ->value [1 ]) ? $ criterion ->value [1 ] : 63510 ;
50
+ if (is_array ($ criterion ->value )) {
51
+ $ minDistance = $ criterion ->value [0 ];
52
+ $ maxDistance = $ criterion ->value [1 ] ?? 63510 ;
53
+ } else {
54
+ $ minDistance = 0 ;
55
+ $ maxDistance = $ criterion ->value ;
56
+ }
54
57
55
- if (( $ criterion -> operator === Operator:: LT ) ||
56
- ( $ criterion ->operator === Operator::LTE )) {
57
- $ end = $ start ;
58
- $ start = null ;
58
+ $ sign = '' ;
59
+ if (( $ criterion ->operator === Operator::GT ) ||
60
+ ( $ criterion -> operator === Operator:: GTE )) {
61
+ $ sign = ' - ' ;
59
62
}
60
63
61
64
$ searchFields = $ this ->getSearchFields (
@@ -77,17 +80,25 @@ public function visit(Criterion $criterion, CriterionVisitor $subVisitor = null)
77
80
78
81
$ queries = [];
79
82
foreach ($ searchFields as $ name => $ fieldType ) {
80
- // @todo in future it should become possible to specify ranges directly on the filter (donut shape)
81
- $ query = sprintf ('{!geofilt sfield=%s pt=%F,%F d=%s} ' , $ name , $ location ->latitude , $ location ->longitude , $ end );
82
- if ($ start !== null ) {
83
- $ query = sprintf ("{!frange l=%F} {$ query }" , $ start );
83
+ if ($ criterion ->operator === Operator::BETWEEN ) {
84
+ $ query = sprintf (
85
+ '{!geofilt sfield=%s pt=%F,%F d=%s} AND -{!geofilt sfield=%s pt=%F,%F d=%s} ' ,
86
+ $ name ,
87
+ $ location ->latitude ,
88
+ $ location ->longitude ,
89
+ $ maxDistance ,
90
+ $ name ,
91
+ $ location ->latitude ,
92
+ $ location ->longitude ,
93
+ $ minDistance
94
+ );
95
+ } else {
96
+ $ query = sprintf ('%s{!geofilt sfield=%s pt=%F,%F d=%s} ' , $ sign , $ name , $ location ->latitude , $ location ->longitude , $ maxDistance );
84
97
}
85
98
86
- $ queries [] = "{$ query } AND {$ name }_0_coordinate :[* TO *] " ;
99
+ $ queries [] = "{$ query } AND {$ name }:[* TO *] " ;
87
100
}
88
101
89
102
return '( ' . implode (' OR ' , $ queries ) . ') ' ;
90
103
}
91
104
}
92
-
93
- class_alias (MapLocationDistanceRange::class, 'EzSystems\EzPlatformSolrSearchEngine\Query\Common\CriterionVisitor\MapLocation\MapLocationDistanceRange ' );
0 commit comments