@@ -465,95 +465,126 @@ private BuiltQuery getBuiltQuery(MultiValueMap<String, String> searchParameters)
465465 }
466466 switch (key ) {
467467 case "~name" :
468- for (String value : parameter .getValue ()) {
469- DisMaxQuery .Builder nameQuery = new DisMaxQuery .Builder ();
470- for (String pattern : value .split (valueSplitPattern )) {
471- nameQuery .queries (getSingleValueQuery ("name" , pattern .trim ()));
472- }
473- boolQuery .must (nameQuery .build ()._toQuery ());
474- }
468+ addNameQuery (parameter , valueSplitPattern , boolQuery );
475469 break ;
476470 case "~tag" :
477- for (String value : parameter .getValue ()) {
478- DisMaxQuery .Builder tagQuery = new DisMaxQuery .Builder ();
479- for (String pattern : value .split (valueSplitPattern )) {
480- tagQuery .queries (
481- NestedQuery .of (n -> n .path ("tags" ).query (
482- getSingleValueQuery ("tags.name" , pattern .trim ())))._toQuery ());
483- }
484- if (isNot ) {
485- boolQuery .mustNot (tagQuery .build ()._toQuery ());
486- } else {
487- boolQuery .must (tagQuery .build ()._toQuery ());
488- }
489-
490- }
471+ addTagsQuery (parameter , valueSplitPattern , isNot , boolQuery );
491472 break ;
492473 case "~size" :
493- Optional <String > maxSize = parameter .getValue ().stream ().max (Comparator .comparing (Integer ::valueOf ));
494- if (maxSize .isPresent ()) {
495- size = Integer .parseInt (maxSize .get ());
496- }
474+ size = parseCountParameter (parameter , size );
497475 break ;
498476 case "~from" :
499- Optional <String > maxFrom = parameter .getValue ().stream ().max (Comparator .comparing (Integer ::valueOf ));
500- if (maxFrom .isPresent ()) {
501- from = Integer .parseInt (maxFrom .get ());
502- }
477+ from = parseCountParameter (parameter , from );
503478 break ;
504479 case "~search_after" :
505480 searchAfter = parameter .getValue ().stream ().findFirst ();
506481 break ;
507482
508483 case "~track_total_hits" :
509- Optional <String > firstTrackTotalHits = parameter .getValue ().stream ().findFirst ();
510- if (firstTrackTotalHits .isPresent ()) {
511- trackTotalHits = Boolean .parseBoolean (firstTrackTotalHits .get ());
512- }
484+ trackTotalHits = isTrackTotalHits (parameter , trackTotalHits );
513485 break ;
514486 default :
515- DisMaxQuery .Builder propertyQuery = new DisMaxQuery .Builder ();
516- for (String value : parameter .getValue ()) {
517- for (String pattern : value .split (valueSplitPattern )) {
518- String finalKey = key ;
519- BoolQuery bq ;
520- if (isNot ) {
521- bq = BoolQuery .of (p -> p .must (getSingleValueQuery ("properties.name" , finalKey ))
522- .mustNot (getSingleValueQuery ("properties.value" , pattern .trim ())));
523- } else {
524- bq = BoolQuery .of (p -> p .must (getSingleValueQuery ("properties.name" , finalKey ))
525- .must (getSingleValueQuery ("properties.value" , pattern .trim ())));
526- }
527- propertyQuery .queries (
528- NestedQuery .of (n -> n .path ("properties" ).query (bq ._toQuery ()))._toQuery ()
529- );
530- }
531- }
487+ DisMaxQuery .Builder propertyQuery = calculatePropertiesQuery (parameter , valueSplitPattern , key , isNot );
532488 boolQuery .must (propertyQuery .build ()._toQuery ());
533489 break ;
534490 }
535491 }
536492 return new BuiltQuery (boolQuery , size , from , searchAfter , trackTotalHits );
537493 }
538494
495+ private static DisMaxQuery .Builder calculatePropertiesQuery (Map .Entry <String , List <String >> parameter , String valueSplitPattern , String key , boolean isNot ) {
496+ DisMaxQuery .Builder propertyQuery = new DisMaxQuery .Builder ();
497+ for (String value : parameter .getValue ()) {
498+ for (String pattern : value .split (valueSplitPattern )) {
499+ BoolQuery bq ;
500+ bq = calculatePropertyQuery (key , isNot , pattern );
501+ addPropertyQuery (isNot , pattern , propertyQuery , bq );
502+ }
503+ }
504+ return propertyQuery ;
505+ }
506+
507+ private static void addPropertyQuery (boolean isNot , String pattern , DisMaxQuery .Builder propertyQuery , BoolQuery bq ) {
508+ if (isNot && pattern .trim ().equals ("*" )) {
509+
510+ propertyQuery .queries (
511+ BoolQuery .of ( p -> p .mustNot (
512+ NestedQuery .of (n -> n .path ("properties" ).query (bq ._toQuery ()))._toQuery ()
513+ ))._toQuery ()
514+ );
515+ } else {
516+
517+ propertyQuery .queries (
518+ NestedQuery .of (n -> n .path ("properties" ).query (bq ._toQuery ()))._toQuery ()
519+ );
520+ }
521+ }
522+
523+ private static BoolQuery calculatePropertyQuery (String key , boolean isNot , String pattern ) {
524+ BoolQuery bq ;
525+ if (isNot ) {
526+ if (pattern .trim ().equals ("*" )) {
527+ bq = BoolQuery .of (p -> p .must (getSingleValueQuery ("properties.name" , key )));
528+ } else {
529+ bq = BoolQuery .of (p -> p .must (getSingleValueQuery ("properties.name" , key ))
530+ .mustNot (getSingleValueQuery ("properties.value" , pattern .trim ())));
531+ }
532+ } else {
533+ bq = BoolQuery .of (p -> p .must (getSingleValueQuery ("properties.name" , key ))
534+ .must (getSingleValueQuery ("properties.value" , pattern .trim ())));
535+ }
536+ return bq ;
537+ }
538+
539+ private static boolean isTrackTotalHits (Map .Entry <String , List <String >> parameter , boolean trackTotalHits ) {
540+ Optional <String > firstTrackTotalHits = parameter .getValue ().stream ().findFirst ();
541+ if (firstTrackTotalHits .isPresent ()) {
542+ trackTotalHits = Boolean .parseBoolean (firstTrackTotalHits .get ());
543+ }
544+ return trackTotalHits ;
545+ }
546+
547+ private static int parseCountParameter (Map .Entry <String , List <String >> parameter , int size ) {
548+ Optional <String > maxSize = parameter .getValue ().stream ().max (Comparator .comparing (Integer ::valueOf ));
549+ if (maxSize .isPresent ()) {
550+ size = Integer .parseInt (maxSize .get ());
551+ }
552+ return size ;
553+ }
554+
555+ private static void addTagsQuery (Map .Entry <String , List <String >> parameter , String valueSplitPattern , boolean isNot , BoolQuery .Builder boolQuery ) {
556+ for (String value : parameter .getValue ()) {
557+ DisMaxQuery .Builder tagQuery = new DisMaxQuery .Builder ();
558+ for (String pattern : value .split (valueSplitPattern )) {
559+ tagQuery .queries (
560+ NestedQuery .of (n -> n .path ("tags" ).query (
561+ getSingleValueQuery ("tags.name" , pattern .trim ())))._toQuery ());
562+ }
563+ if (isNot ) {
564+ boolQuery .mustNot (tagQuery .build ()._toQuery ());
565+ } else {
566+ boolQuery .must (tagQuery .build ()._toQuery ());
567+ }
568+
569+ }
570+ }
571+
572+ private static void addNameQuery (Map .Entry <String , List <String >> parameter , String valueSplitPattern , BoolQuery .Builder boolQuery ) {
573+ for (String value : parameter .getValue ()) {
574+ DisMaxQuery .Builder nameQuery = new DisMaxQuery .Builder ();
575+ for (String pattern : value .split (valueSplitPattern )) {
576+ nameQuery .queries (getSingleValueQuery ("name" , pattern .trim ()));
577+ }
578+ boolQuery .must (nameQuery .build ()._toQuery ());
579+ }
580+ }
581+
539582 private static Query getSingleValueQuery (String name , String pattern ) {
540583 return WildcardQuery .of (w -> w .field (name ).caseInsensitive (true ).value (pattern ))._toQuery ();
541584 }
542585
543- private static class BuiltQuery {
544- public final BoolQuery .Builder boolQuery ;
545- public final Integer size ;
546- public final Integer from ;
547- public final Optional <String > searchAfter ;
548- public final boolean trackTotalHits ;
549-
550- public BuiltQuery (BoolQuery .Builder boolQuery , Integer size , Integer from , Optional <String > searchAfter , boolean trackTotalHits ) {
551- this .boolQuery = boolQuery ;
552- this .size = size ;
553- this .from = from ;
554- this .searchAfter = searchAfter ;
555- this .trackTotalHits = trackTotalHits ;
556- }
586+ private record BuiltQuery (BoolQuery .Builder boolQuery , Integer size , Integer from , Optional <String > searchAfter ,
587+ boolean trackTotalHits ) {
557588 }
558589
559590 /**
0 commit comments