@@ -6,6 +6,122 @@ import {
6
6
} from './geo-rules-adapter'
7
7
import { adaptFilters } from './filter-adapter'
8
8
9
+ /**
10
+ * Adapts instantsearch.js and instant-meilisearch options
11
+ * to meilisearch search query parameters.
12
+ *
13
+ * @param {SearchContext } searchContext
14
+ *
15
+ * @returns {MeiliSearchParams }
16
+ */
17
+ function MeiliParamsCreator ( searchContext : SearchContext ) {
18
+ const meiliSearchParams : Record < string , any > = { }
19
+ const {
20
+ facets,
21
+ attributesToSnippet,
22
+ snippetEllipsisText,
23
+ attributesToRetrieve,
24
+ filters,
25
+ numericFilters,
26
+ facetFilters,
27
+ attributesToHighlight,
28
+ highlightPreTag,
29
+ highlightPostTag,
30
+ placeholderSearch,
31
+ query,
32
+ finitePagination,
33
+ sort,
34
+ pagination,
35
+ } = searchContext
36
+
37
+ return {
38
+ getParams ( ) {
39
+ return meiliSearchParams
40
+ } ,
41
+ addFacets ( ) {
42
+ if ( facets ?. length ) {
43
+ meiliSearchParams . facets = facets
44
+ }
45
+ } ,
46
+ addAttributesToCrop ( ) {
47
+ if ( attributesToSnippet ) {
48
+ meiliSearchParams . attributesToCrop = attributesToSnippet
49
+ }
50
+ } ,
51
+ addCropMarker ( ) {
52
+ // Attributes To Crop marker
53
+ if ( snippetEllipsisText != null ) {
54
+ meiliSearchParams . cropMarker = snippetEllipsisText
55
+ }
56
+ } ,
57
+ addAttributesToRetrieve ( ) {
58
+ if ( attributesToRetrieve ) {
59
+ meiliSearchParams . attributesToRetrieve = attributesToRetrieve
60
+ }
61
+ } ,
62
+ addFilters ( ) {
63
+ const filter = adaptFilters ( filters , numericFilters , facetFilters )
64
+ if ( filter . length ) {
65
+ meiliSearchParams . filter = filter
66
+ }
67
+ } ,
68
+ addAttributesToHighlight ( ) {
69
+ meiliSearchParams . attributesToHighlight = attributesToHighlight || [ '*' ]
70
+ } ,
71
+ addPreTag ( ) {
72
+ if ( highlightPreTag ) {
73
+ meiliSearchParams . highlightPreTag = highlightPreTag
74
+ } else {
75
+ meiliSearchParams . highlightPreTag = '__ais-highlight__'
76
+ }
77
+ } ,
78
+ addPostTag ( ) {
79
+ if ( highlightPostTag ) {
80
+ meiliSearchParams . highlightPostTag = highlightPostTag
81
+ } else {
82
+ meiliSearchParams . highlightPostTag = '__/ais-highlight__'
83
+ }
84
+ } ,
85
+ addPagination ( ) {
86
+ // Limit based on pagination preferences
87
+ if (
88
+ ( ! placeholderSearch && query === '' ) ||
89
+ pagination . paginationTotalHits === 0
90
+ ) {
91
+ meiliSearchParams . limit = 0
92
+ } else if ( finitePagination ) {
93
+ meiliSearchParams . limit = pagination . paginationTotalHits
94
+ } else {
95
+ const limit = ( pagination . page + 1 ) * pagination . hitsPerPage + 1
96
+ // If the limit is bigger than the total hits accepted
97
+ // force the limit to that amount
98
+ if ( limit > pagination . paginationTotalHits ) {
99
+ meiliSearchParams . limit = pagination . paginationTotalHits
100
+ } else {
101
+ meiliSearchParams . limit = limit
102
+ }
103
+ }
104
+ } ,
105
+ addSort ( ) {
106
+ if ( sort ?. length ) {
107
+ meiliSearchParams . sort = [ sort ]
108
+ }
109
+ } ,
110
+ addGeoSearchRules ( ) {
111
+ const geoSearchContext = createGeoSearchContext ( searchContext )
112
+ const geoRules = adaptGeoPointsRules ( geoSearchContext )
113
+
114
+ if ( geoRules ?. filter ) {
115
+ if ( meiliSearchParams . filter ) {
116
+ meiliSearchParams . filter . unshift ( geoRules . filter )
117
+ } else {
118
+ meiliSearchParams . filter = [ geoRules . filter ]
119
+ }
120
+ }
121
+ } ,
122
+ }
123
+ }
124
+
9
125
/**
10
126
* Adapt search request from instantsearch.js
11
127
* to search request compliant with Meilisearch
@@ -16,111 +132,18 @@ import { adaptFilters } from './filter-adapter'
16
132
export function adaptSearchParams (
17
133
searchContext : SearchContext
18
134
) : MeiliSearchParams {
19
- // Creates search params object compliant with Meilisearch
20
- const meiliSearchParams : Record < string , any > = { }
21
-
22
- // Facets
23
- const facets = searchContext ?. facets
24
- if ( facets ?. length ) {
25
- meiliSearchParams . facets = facets
26
- }
27
-
28
- // Attributes To Crop
29
- const attributesToCrop = searchContext ?. attributesToSnippet
30
- if ( attributesToCrop ) {
31
- meiliSearchParams . attributesToCrop = attributesToCrop
32
- }
33
-
34
- // Attributes To Crop marker
35
- const cropMarker = searchContext ?. snippetEllipsisText
36
- if ( cropMarker != null ) {
37
- meiliSearchParams . cropMarker = cropMarker
38
- }
39
-
40
- // Attributes To Retrieve
41
- const attributesToRetrieve = searchContext ?. attributesToRetrieve
42
- if ( attributesToRetrieve ) {
43
- meiliSearchParams . attributesToRetrieve = attributesToRetrieve
44
- }
45
-
46
- // Filter
47
- const filter = adaptFilters (
48
- searchContext ?. filters ,
49
- searchContext ?. numericFilters ,
50
- searchContext ?. facetFilters
51
- )
52
- if ( filter . length ) {
53
- meiliSearchParams . filter = filter
54
- }
55
-
56
- // Attributes To Retrieve
57
- if ( attributesToRetrieve ) {
58
- meiliSearchParams . attributesToCrop = attributesToRetrieve
59
- }
60
-
61
- // Attributes To Highlight
62
- meiliSearchParams . attributesToHighlight = searchContext ?. attributesToHighlight || [
63
- '*' ,
64
- ]
65
-
66
- // Highlight pre tag
67
- const highlightPreTag = searchContext ?. highlightPreTag
68
- if ( highlightPreTag ) {
69
- meiliSearchParams . highlightPreTag = highlightPreTag
70
- } else {
71
- meiliSearchParams . highlightPreTag = '__ais-highlight__'
72
- }
73
-
74
- // Highlight post tag
75
- const highlightPostTag = searchContext ?. highlightPostTag
76
- if ( highlightPostTag ) {
77
- meiliSearchParams . highlightPostTag = highlightPostTag
78
- } else {
79
- meiliSearchParams . highlightPostTag = '__/ais-highlight__'
80
- }
81
-
82
- const placeholderSearch = searchContext . placeholderSearch
83
- const query = searchContext . query
84
-
85
- // Pagination
86
- const { pagination } = searchContext
87
-
88
- // Limit based on pagination preferences
89
- if (
90
- ( ! placeholderSearch && query === '' ) ||
91
- pagination . paginationTotalHits === 0
92
- ) {
93
- meiliSearchParams . limit = 0
94
- } else if ( searchContext . finitePagination ) {
95
- meiliSearchParams . limit = pagination . paginationTotalHits
96
- } else {
97
- const limit = ( pagination . page + 1 ) * pagination . hitsPerPage + 1
98
- // If the limit is bigger than the total hits accepted
99
- // force the limit to that amount
100
- if ( limit > pagination . paginationTotalHits ) {
101
- meiliSearchParams . limit = pagination . paginationTotalHits
102
- } else {
103
- meiliSearchParams . limit = limit
104
- }
105
- }
106
-
107
- const sort = searchContext . sort
108
-
109
- // Sort
110
- if ( sort ?. length ) {
111
- meiliSearchParams . sort = [ sort ]
112
- }
113
-
114
- const geoSearchContext = createGeoSearchContext ( searchContext )
115
- const geoRules = adaptGeoPointsRules ( geoSearchContext )
116
-
117
- if ( geoRules ?. filter ) {
118
- if ( meiliSearchParams . filter ) {
119
- meiliSearchParams . filter . unshift ( geoRules . filter )
120
- } else {
121
- meiliSearchParams . filter = [ geoRules . filter ]
122
- }
123
- }
124
-
125
- return meiliSearchParams
135
+ const meilisearchParams = MeiliParamsCreator ( searchContext )
136
+ meilisearchParams . addFacets ( )
137
+ meilisearchParams . addAttributesToHighlight ( )
138
+ meilisearchParams . addPreTag ( )
139
+ meilisearchParams . addPostTag ( )
140
+ meilisearchParams . addAttributesToRetrieve ( )
141
+ meilisearchParams . addAttributesToCrop ( )
142
+ meilisearchParams . addCropMarker ( )
143
+ meilisearchParams . addPagination ( )
144
+ meilisearchParams . addFilters ( )
145
+ meilisearchParams . addSort ( )
146
+ meilisearchParams . addGeoSearchRules ( )
147
+
148
+ return meilisearchParams . getParams ( )
126
149
}
0 commit comments