@@ -23,7 +23,7 @@ const FILTERS_WIDTH = 250
2323const FILTERABLE_RESOURCES = [ 'concepts' , 'mappings' , 'repos' , 'sources' , 'collections' , 'references' ]
2424
2525const Search = props => {
26- const { setAlert } = React . useContext ( OperationsContext ) ;
26+ const { setAlert, contextRepo } = React . useContext ( OperationsContext ) ;
2727 const { t } = useTranslation ( )
2828 const history = useHistory ( ) ;
2929 const location = useLocation ( ) ;
@@ -40,6 +40,8 @@ const Search = props => {
4040 const [ showItem , setShowItem ] = React . useState ( false )
4141 const [ order , setOrder ] = React . useState ( 'desc' ) ;
4242 const [ orderBy , setOrderBy ] = React . useState ( 'score' ) ;
43+ const [ isMatchOp , setIsMatchOp ] = React . useState ( false )
44+
4345 const didMount = React . useRef ( false ) ;
4446 const isFilterable = _resource => FILTERABLE_RESOURCES . includes ( _resource )
4547
@@ -69,6 +71,8 @@ const Search = props => {
6971 const getCurrentLayoutURL = ( params , _resource ) => {
7072 /*eslint no-unused-vars: 0*/
7173 const { q, page, limit, includeSearchMeta, sortAsc, sortDesc, ...filters } = params
74+ const isMatch = params [ '$match' ]
75+ delete filters [ '$match' ]
7276 _resource = _resource || resource || 'concepts'
7377 if ( _resource === 'organizations' )
7478 _resource = 'orgs'
@@ -81,6 +85,8 @@ const Search = props => {
8185 url += `&limit=${ limit } `
8286 if ( page && page > 1 )
8387 url += `&page=${ page } `
88+ if ( isMatch )
89+ url += '&$match=true'
8490 if ( ! isEmpty ( filters ) ) {
8591 if ( _resource === 'references' )
8692 url += Object . entries ( filters )
@@ -129,6 +135,7 @@ const Search = props => {
129135 const setQueryParamsInState = ( mustFetch , includeRepoDefaultFilters ) => {
130136 const queryParams = new URLSearchParams ( window . location . hash . split ( '?' ) [ 1 ] )
131137 const value = queryParams . get ( 'q' ) || ''
138+ const isMatch = queryParams . get ( '$match' ) === 'true'
132139 const isDiffFromPrevInput = value !== input
133140 const _page = parseInt ( queryParams . get ( 'page' ) || 1 )
134141 const _pageSize = parseInt ( queryParams . get ( 'limit' ) || 25 )
@@ -156,6 +163,11 @@ const Search = props => {
156163 if ( includeRepoDefaultFilters && ! _filters && props . repoDefaultFilters ) {
157164 _filters = getAppliedFacetFromQueryParam ( props . repoDefaultFilters )
158165 }
166+ if ( ! isEqual ( isMatch , isMatchOp ) ) {
167+ setIsMatchOp ( isMatch )
168+ _fetch = true
169+ _fetchFacets = false
170+ }
159171 if ( ! isEqual ( filters , _filters ) ) {
160172 setFilters ( _filters )
161173 _fetchFacets = true
@@ -184,8 +196,12 @@ const Search = props => {
184196 _fetch = true
185197 }
186198
187- if ( _fetch )
188- fetchResults ( getQueryParams ( value , _page , _pageSize , _filters , _orderBy , _order ) , _fetchFacets , _resource )
199+ if ( _fetch ) {
200+ if ( isMatch )
201+ fetchMatchResults ( getQueryParams ( value , _page , _pageSize , _filters , _orderBy , _order ) )
202+ else
203+ fetchResults ( getQueryParams ( value , _page , _pageSize , _filters , _orderBy , _order ) , _fetchFacets , _resource )
204+ }
189205 }
190206
191207 const getAppliedFacetFromQueryParam = filters => {
@@ -227,6 +243,8 @@ const Search = props => {
227243 } else if ( ! _input ) {
228244 params . sortAsc = 'id'
229245 }
246+ if ( isMatchOp )
247+ params [ '$match' ] = true
230248 return params
231249 }
232250
@@ -274,6 +292,31 @@ const Search = props => {
274292 } )
275293 }
276294
295+
296+ const fetchMatchResults = ( params ) => {
297+ let __resource = 'concepts'
298+ setLoading ( true )
299+ setResult ( prev => {
300+ return { ...prev , [ __resource ] : { ...result [ __resource ] , results : [ ] } }
301+ } )
302+ let _filters = omit ( params , [ 'q' , 'page' , 'page_number' , 'page_size' , 'limit' , 'offset' , 'includeSearchMeta' , 'verbose' , 'order' , 'orderBy' , 'sortAsc' , 'sortDesc' , 'display' , 'type' ] )
303+ const payload = { rows : [ { name : params . q } ] , target_repo_url : contextRepo ?. version_url , filter : _filters || { } }
304+ APIService . new ( ) . overrideURL ( '/concepts/$match/' ) . post ( payload , null , null , { verbose : true , includeSearchMeta : true , semantic : true , reranker : true , ...params } ) . then ( response => {
305+ if ( response ?. detail ) {
306+ setAlert ( { message : response . detail , severity : 'error' , duration : 5000 } )
307+ setLoading ( false )
308+ return
309+ }
310+ let __results = get ( response , 'data.0.results' ) || [ ]
311+ let total = __results . length + 10
312+ const resourceResult = { total : total , pageSize : params ?. limit || 10 , page : params ?. page || params ?. page_number || 1 , pages : 2 , results : __results || [ ] , facets : result [ __resource ] ?. facets || { } }
313+ setResult ( prev => {
314+ return { ...result , [ __resource ] : resourceResult }
315+ } )
316+ setLoading ( false )
317+ } )
318+ }
319+
277320 const fetchFacets = ( params , otherResults , _resource = undefined ) => {
278321 setLoadingFacets ( true )
279322 const __resource = _resource || resource
@@ -451,6 +494,7 @@ const Search = props => {
451494 excludedColumns = { props . excludedColumns }
452495 properties = { props . properties }
453496 propertyFilters = { props . propertyFilters }
497+ isMatch = { isMatchOp }
454498 />
455499 </ div >
456500 </ div >
0 commit comments