001/* 002 * Copyright 2020 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.cms.search.query; 017 018import java.util.Map; 019import java.util.Optional; 020 021import org.apache.commons.lang.StringUtils; 022import org.apache.solr.client.solrj.util.ClientUtils; 023 024/** 025 * Isolate a query by wrapping it. Used for special cases to force Solr to distinguish specific parts of the global query. 026 */ 027public class IsolateQuery extends AbstractWrapperQuery 028{ 029 /** 030 * Isolate a query. 031 * @param query the wrapped {@link Query}. 032 */ 033 public IsolateQuery(Query query) 034 { 035 super(query); 036 } 037 038 public String build() throws QuerySyntaxException 039 { 040 String build = getSubQuery().build(); 041 if (StringUtils.isBlank(build)) 042 { 043 build = new MatchAllQuery().build(); 044 } 045 046 StringBuilder sb = new StringBuilder() 047 .append("{!isolate v=\"") 048 .append(ClientUtils.escapeQueryChars(build)) 049 .append("\"}"); 050 return sb.toString(); 051 } 052 053 public Optional<Object> buildAsJson() throws QuerySyntaxException 054 { 055 Optional<Object> json = getSubQuery().buildAsJson(); 056 if (json.isPresent() && json.get() instanceof String jsonStr && StringUtils.isBlank(jsonStr)) 057 { 058 json = new MatchAllQuery().buildAsJson(); 059 } 060 061 return json.map(q -> Map.of("isolate", Map.of("query", q))); 062 } 063}