@@ -58,63 +58,10 @@ let splitSearchQuery = function (query) {
5858 return result ;
5959}
6060
61- let bookmarkContainsSearchedTerm = function ( bookmark , searchedTerm ) {
62- let result = false ;
63- // const escapedSearchPattern = '\\b' + this.escapeRegExp(searchedTerm.toLowerCase()) + '\\b'; word boundary was not enough, especially for special characters which can happen in coding
64- // https://stackoverflow.com/questions/23458872/javascript-regex-word-boundary-b-issue
65- const separatingChars = '\\s\\.,;#\\-\\/_\\[\\]\\(\\)\\*\\+' ;
66- const escapedSearchPattern = `(^|[${ separatingChars } ])(${ escapeRegExp ( searchedTerm . toLowerCase ( ) ) } )(?=$|[${ separatingChars } ])` ;
67- const pattern = new RegExp ( escapedSearchPattern ) ;
68- if ( ( bookmark . name && pattern . test ( bookmark . name . toLowerCase ( ) ) )
69- || ( bookmark . location && pattern . test ( bookmark . location . toLowerCase ( ) ) )
70- || ( bookmark . description && pattern . test ( bookmark . description . toLowerCase ( ) ) )
71- || ( bookmark . sourceCodeURL && pattern . test ( bookmark . sourceCodeURL . toLowerCase ( ) ) )
72- ) {
73- result = true ;
74- }
75-
76- if ( result ) {
77- return true ;
78- } else {
79- // if not found already look through the tags also
80- bookmark . tags . forEach ( tag => {
81- if ( pattern . test ( tag . toLowerCase ( ) ) ) {
82- result = true ;
83- }
84- } ) ;
85- }
8661
87- return result ;
88- }
89-
90- function escapeRegExp ( str ) {
91- const specials = [
92- // order matters for these
93- '-'
94- , '['
95- , ']'
96- // order doesn't matter for any of these
97- , '/'
98- , '{'
99- , '}'
100- , '('
101- , ')'
102- , '*'
103- , '+'
104- , '?'
105- , '.'
106- , '\\'
107- , '^'
108- , '$'
109- , '|'
110- ] ,
111- regex = RegExp ( '[' + specials . join ( '\\' ) + ']' , 'g' ) ;
112- return str . replace ( regex , '\\$&' ) ; // $& means the whole matched string
113- }
114-
115- let extractSpecialSearchTerms = function ( searchedTerms ) {
62+ let extractFulltextAndSpecialSearchTerms = function ( searchedTerms ) {
11663 let specialSearchFilters = { }
117- let nonSpecialSearchTerms = [ ] ;
64+ let fulltextSearchTerms = [ ] ;
11865 for ( let i = 0 ; i < searchedTerms . length ; i ++ ) {
11966 const searchTerm = searchedTerms [ i ] ;
12067
@@ -141,39 +88,50 @@ let extractSpecialSearchTerms = function (searchedTerms) {
14188 continue ;
14289 }
14390
144- nonSpecialSearchTerms . push ( searchTerm ) ;
91+ fulltextSearchTerms . push ( searchTerm ) ;
14592 }
14693
14794 return {
14895 specialSearchFilters : specialSearchFilters ,
149- nonSpecialSearchTerms : nonSpecialSearchTerms
96+ fulltextSearchTerms : fulltextSearchTerms
15097 }
15198}
15299
153100/*
154- The default search in Mongo uses the OR operatar , here
101+ The default search in Mongo uses the OR operator , here
155102 we make to AND by placing the search terms between ""
156103 */
157- let generateFullSearchText = function ( nonSpecialSearchTerms ) {
104+ let generateFullSearchText = function ( fulltextSearchTerms ) {
158105 let termsQuery = '' ;
159- nonSpecialSearchTerms . forEach ( searchTerm => {
160- if ( searchTerm . startsWith ( '-' ) ) {
106+ fulltextSearchTerms . forEach ( searchTerm => {
107+ if ( searchTerm . startsWith ( '-' ) ) { // "-" means it must not contain this searchTerm
161108 termsQuery += ' ' + searchTerm ;
162109 } else { //wrap it in quotes to make it a default AND in search
163110 termsQuery += ' "' + searchTerm . substring ( 0 , searchTerm . length ) + '"' ;
164111 }
165112 } ) ;
166- //const termsJoined = nonSpecialSearchTerms.join(' ');
167- //const termsQuery = escapeStringRegexp(termsJoined);
168- //const termsQuery = termsJoined;
169113
170114 return termsQuery . trim ( ) ;
171115} ;
172116
117+ let includeFulltextSearchTermsInFilter = function ( fulltextSearchTerms , filter , searchInclude ) {
118+ let newFilter = { ...filter } ;
119+ if ( fulltextSearchTerms . length > 0 ) {
120+ let searchText = '' ;
121+ if ( searchInclude === 'any' ) {
122+ searchText = { $search : fulltextSearchTerms . join ( ' ' ) }
123+ } else {
124+ searchText = { $search : generateFullSearchText ( fulltextSearchTerms ) } ;
125+ }
126+
127+ newFilter . $text = searchText ;
128+ }
129+ return newFilter ;
130+ }
131+
173132module . exports = {
174133 splitSearchQuery : splitSearchQuery ,
175- bookmarkContainsSearchedTerm : bookmarkContainsSearchedTerm ,
176- extractSpecialSearchTerms : extractSpecialSearchTerms ,
177- escapeRegExp : escapeRegExp ,
178- generateFullSearchText : generateFullSearchText
134+ extractFulltextAndSpecialSearchTerms : extractFulltextAndSpecialSearchTerms ,
135+ generateFullSearchText : generateFullSearchText ,
136+ includeFulltextSearchTermsInFilter : includeFulltextSearchTermsInFilter
179137}
0 commit comments