<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>MtasSolrResultUtil.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">MTAS</a> > <a href="index.source.html" class="el_package">mtas.solr.handler.component.util</a> > <span class="el_source">MtasSolrResultUtil.java</span></div><h1>MtasSolrResultUtil.java</h1><pre class="source lang-java linenums">package mtas.solr.handler.component.util; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Reader; import java.io.Serializable; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.Base64; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; import mtas.codec.util.DataCollector; import mtas.codec.util.CodecComponent.GroupHit; import mtas.codec.util.collector.MtasDataItem; import mtas.parser.cql.MtasCQLParser; import mtas.parser.cql.TokenMgrError; import mtas.search.spans.util.MtasSpanQuery; import mtas.solr.handler.component.MtasSolrSearchComponent; /** * The Class MtasSolrResultUtil. */ public class MtasSolrResultUtil { /** The Constant log. */ <span class="fc" id="L44"> private static final Log log = LogFactory.getLog(MtasSolrResultUtil.class);</span> /** The Constant QUERY_TYPE_CQL. */ public static final String QUERY_TYPE_CQL = "cql"; /** The Constant patternKeyStartGrouphit. */ <span class="fc" id="L50"> public static final Pattern patternKeyStartGrouphit = Pattern</span> <span class="fc" id="L51"> .compile("^" + GroupHit.KEY_START);</span> /** * Instantiates a new mtas solr result util. */ <span class="nc" id="L56"> private MtasSolrResultUtil() {</span> // do nothing <span class="nc" id="L58"> }</span> /** * Rewrite. * * @param al the al * @param searchComponent the search component * @throws IOException Signals that an I/O exception has occurred. */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static void rewrite(ArrayList<?> al, MtasSolrSearchComponent searchComponent) throws IOException { <span class="fc bfc" id="L70" title="All 2 branches covered."> for (int i = 0; i < al.size(); i++) {</span> <span class="pc bpc" id="L71" title="1 of 2 branches missed."> if (al.get(i) instanceof NamedList) {</span> <span class="fc" id="L72"> rewrite((NamedList) al.get(i), searchComponent);</span> <span class="nc bnc" id="L73" title="All 2 branches missed."> } else if (al.get(i) instanceof ArrayList) {</span> <span class="nc" id="L74"> rewrite((ArrayList) al.get(i), searchComponent);</span> } } <span class="fc" id="L77"> }</span> /** * Rewrite. * * @param nl the nl * @param searchComponent the search component * @throws IOException Signals that an I/O exception has occurred. */ public static void rewrite(NamedList<Object> nl, MtasSolrSearchComponent searchComponent) throws IOException { <span class="fc" id="L88"> rewrite(nl, searchComponent, true);</span> <span class="fc" id="L89"> }</span> /** * Rewrite. * * @param nl the nl * @param searchComponent the search component * @param doCollapse the do collapse * @throws IOException Signals that an I/O exception has occurred. */ @SuppressWarnings({ "rawtypes", "unchecked" }) private static void rewrite(NamedList<Object> nl, MtasSolrSearchComponent searchComponent, boolean doCollapse) throws IOException { <span class="fc" id="L103"> boolean showDebugInfo = false;</span> <span class="fc" id="L104"> HashMap<String, NamedList<Object>> collapseNamedList = new HashMap<>();</span> <span class="fc" id="L105"> int length = nl.size();</span> <span class="fc bfc" id="L106" title="All 2 branches covered."> for (int i = 0; i < length; i++) {</span> <span class="pc bpc" id="L107" title="1 of 2 branches missed."> if (nl.getVal(i) instanceof NamedList) {</span> <span class="nc" id="L108"> NamedList o = (NamedList) nl.getVal(i);</span> <span class="nc" id="L109"> rewrite(o, searchComponent, true);</span> <span class="nc" id="L110"> nl.setVal(i, o);</span> <span class="pc bfc" id="L111" title="All 2 branches covered."> } else if (nl.getVal(i) instanceof ArrayList) {</span> <span class="fc" id="L112"> ArrayList o = (ArrayList) nl.getVal(i);</span> <span class="fc" id="L113"> rewrite(o, searchComponent);</span> <span class="fc" id="L114"> nl.setVal(i, o);</span> <span class="pc bpc" id="L115" title="1 of 2 branches missed."> } else if (nl.getVal(i) instanceof MtasDataItem) {</span> <span class="nc" id="L116"> MtasDataItem dataItem = (MtasDataItem) nl.getVal(i);</span> <span class="nc" id="L117"> nl.setVal(i, dataItem.rewrite(showDebugInfo));</span> <span class="pc bfc" id="L118" title="All 2 branches covered."> } else if (nl.getVal(i) instanceof MtasSolrCollectionResult) {</span> <span class="fc" id="L119"> MtasSolrCollectionResult o = (MtasSolrCollectionResult) nl.getVal(i);</span> <span class="fc" id="L120"> collapseNamedList.put(nl.getName(i), o.rewrite(searchComponent));</span> <span class="fc bfc" id="L121" title="All 2 branches covered."> } else if (nl.getVal(i) instanceof MtasSolrMtasResult) {</span> <span class="fc" id="L122"> MtasSolrMtasResult o = (MtasSolrMtasResult) nl.getVal(i);</span> <span class="fc" id="L123"> if (o.dataCollector.getCollectorType()</span> <span class="fc bfc" id="L124" title="All 2 branches covered."> .equals(DataCollector.COLLECTOR_TYPE_LIST)) {</span> <span class="fc bfc" id="L125" title="All 2 branches covered."> if (!o.dataCollector.withTotal()) {</span> <span class="fc" id="L126"> NamedList<Object> nnl = o.getNamedList(showDebugInfo);</span> <span class="fc bfc" id="L127" title="All 2 branches covered."> for (int j = 0; j < nnl.size(); j++) {</span> <span class="pc bpc" id="L128" title="1 of 2 branches missed."> if (nnl.getVal(j) != null</span> <span class="pc bpc" id="L129" title="1 of 2 branches missed."> && nnl.getVal(j) instanceof MtasDataItem) {</span> <span class="nc" id="L130"> MtasDataItem mdi = (MtasDataItem) nnl.getVal(j);</span> <span class="nc" id="L131"> mdi.rewrite(showDebugInfo);</span> <span class="nc" id="L132"> nnl.setVal(j, mdi);</span> } } // System.out.println("rewrite -- "+nnl); <span class="fc" id="L136"> nl.setVal(i, rewriteToArray(nnl));</span> // System.out.println("rewrite! "+nl.getVal(i)); <span class="fc" id="L138"> } else {</span> <span class="fc" id="L139"> NamedList<Object> tmpResponse = new SimpleOrderedMap<>();</span> <span class="fc" id="L140"> tmpResponse.add(nl.getName(i) + "Total", o.dataCollector.getSize());</span> <span class="fc" id="L141"> NamedList<Object> nnl = o.getNamedList(showDebugInfo);</span> <span class="fc bfc" id="L142" title="All 2 branches covered."> for (int j = 0; j < nnl.size(); j++) {</span> <span class="pc bpc" id="L143" title="1 of 2 branches missed."> if (nnl.getVal(j) != null</span> <span class="pc bpc" id="L144" title="1 of 2 branches missed."> && nnl.getVal(j) instanceof MtasDataItem) {</span> <span class="nc" id="L145"> MtasDataItem mdi = (MtasDataItem) nnl.getVal(j);</span> <span class="nc" id="L146"> mdi.rewrite(showDebugInfo);</span> <span class="nc" id="L147"> nnl.setVal(j, mdi);</span> } } <span class="fc" id="L150"> tmpResponse.add(nl.getName(i), rewriteToArray(nnl));</span> <span class="fc" id="L151"> nl.setVal(i, null);</span> <span class="fc" id="L152"> collapseNamedList.put(nl.getName(i), tmpResponse);</span> <span class="fc" id="L153"> }</span> <span class="fc" id="L154"> } else if (o.dataCollector.getCollectorType()</span> <span class="pc bpc" id="L155" title="1 of 2 branches missed."> .equals(DataCollector.COLLECTOR_TYPE_DATA)) {</span> <span class="fc" id="L156"> NamedList<Object> nnl = o.getData(showDebugInfo);</span> <span class="fc bfc" id="L157" title="All 2 branches covered."> if (nnl.size() > 0) {</span> <span class="fc" id="L158"> rewrite(nnl, searchComponent);</span> <span class="fc" id="L159"> collapseNamedList.put(nl.getName(i), nnl);</span> <span class="fc" id="L160"> nl.setVal(i, nnl);</span> } else { <span class="fc" id="L162"> nl.setVal(i, null);</span> } } } } // collapse <span class="pc bpc" id="L168" title="1 of 4 branches missed."> if (doCollapse && collapseNamedList.size() > 0) {</span> <span class="fc bfc" id="L169" title="All 2 branches covered."> for (String key : collapseNamedList.keySet()) {</span> <span class="fc" id="L170"> nl.remove(key);</span> <span class="fc" id="L171"> }</span> <span class="fc bfc" id="L172" title="All 2 branches covered."> for (NamedList<Object> items : collapseNamedList.values()) {</span> <span class="fc" id="L173"> nl.addAll(items);</span> <span class="fc" id="L174"> }</span> } <span class="fc" id="L176"> }</span> /** * Rewrite to array. * * @param nnl the nnl * @return the array list */ private static ArrayList<NamedList<Object>> rewriteToArray( NamedList<Object> nnl) { <span class="fc" id="L186"> ArrayList<NamedList<Object>> al = new ArrayList<>();</span> String key; <span class="fc" id="L188"> Iterator<Entry<String, Object>> it = nnl.iterator();</span> <span class="fc bfc" id="L189" title="All 2 branches covered."> while (it.hasNext()) {</span> <span class="fc" id="L190"> Entry<String, Object> entry = it.next();</span> <span class="fc" id="L191"> NamedList<Object> item = (NamedList<Object>) entry.getValue();</span> <span class="fc" id="L192"> key = entry.getKey();</span> <span class="pc bpc" id="L193" title="1 of 2 branches missed."> if (key.startsWith(GroupHit.KEY_START)) {</span> <span class="nc" id="L194"> StringBuilder newKey = new StringBuilder("");</span> <span class="nc" id="L195"> item.add("group", GroupHit.keyToObject(key, newKey));</span> <span class="nc" id="L196"> item.add("key", newKey.toString().trim());</span> <span class="nc" id="L197"> } else {</span> <span class="fc" id="L198"> item.add("key", key);</span> } <span class="fc" id="L200"> al.add(item);</span> <span class="fc" id="L201"> }</span> <span class="fc" id="L202"> return al;</span> } /** * Rewrite merge list. * * @param key the key * @param subKey the sub key * @param snl the snl * @param tnl the tnl */ @SuppressWarnings({ "unchecked", "unused" }) private static void rewriteMergeList(String key, String subKey, NamedList<Object> snl, NamedList<Object> tnl) { <span class="nc bnc" id="L216" title="All 2 branches missed."> for (int i = 0; i < tnl.size(); i++) {</span> <span class="nc" id="L217"> Object item = snl.get(tnl.getName(i));</span> <span class="nc bnc" id="L218" title="All 4 branches missed."> if (item != null && tnl.getVal(i) instanceof NamedList) {</span> <span class="nc" id="L219"> NamedList<Object> tnnl = (NamedList<Object>) tnl.getVal(i);</span> <span class="nc" id="L220"> Object o = tnnl.get(key);</span> NamedList<Object> tnnnl; <span class="nc bnc" id="L222" title="All 4 branches missed."> if (o != null && o instanceof NamedList) {</span> <span class="nc" id="L223"> tnnnl = (NamedList<Object>) o;</span> } else { <span class="nc" id="L225"> tnnnl = new SimpleOrderedMap<>();</span> <span class="nc" id="L226"> tnnl.add(key, tnnnl);</span> } <span class="nc" id="L228"> tnnnl.add(subKey, item);</span> } } <span class="nc" id="L231"> }</span> /** * Rewrite merge data. * * @param key the key * @param subKey the sub key * @param snl the snl * @param tnl the tnl */ @SuppressWarnings({ "unused", "unchecked" }) private static void rewriteMergeData(String key, String subKey, NamedList<Object> snl, NamedList<Object> tnl) { <span class="nc bnc" id="L244" title="All 2 branches missed."> if (snl != null) {</span> <span class="nc" id="L245"> Object o = tnl.get(key);</span> NamedList<Object> tnnnl; <span class="nc bnc" id="L247" title="All 4 branches missed."> if (o != null && o instanceof NamedList) {</span> <span class="nc" id="L248"> tnnnl = (NamedList<Object>) o;</span> } else { <span class="nc" id="L250"> tnnnl = new SimpleOrderedMap<>();</span> <span class="nc" id="L251"> tnl.add(key, tnnnl);</span> } <span class="nc" id="L253"> tnnnl.add(subKey, snl);</span> } <span class="nc" id="L255"> }</span> /** * Encode. * * @param o the o * @return the string * @throws IOException Signals that an I/O exception has occurred. */ public static String encode(Object o) throws IOException { <span class="pc bpc" id="L265" title="1 of 2 branches missed."> if (o instanceof Serializable) {</span> <span class="fc" id="L266"> ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();</span> ObjectOutputStream objectOutputStream; try { <span class="fc" id="L269"> objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);</span> <span class="fc" id="L270"> objectOutputStream.writeObject(o);</span> <span class="fc" id="L271"> objectOutputStream.close();</span> <span class="fc" id="L272"> byte[] byteArray = byteArrayOutputStream.toByteArray();</span> <span class="fc" id="L273"> return Base64.byteArrayToBase64(byteArray);</span> <span class="nc" id="L274"> } catch (IOException e) {</span> <span class="nc" id="L275"> e.printStackTrace();</span> <span class="nc" id="L276"> log.error(e);</span> <span class="nc" id="L277"> return null;</span> } } else { <span class="nc" id="L280"> throw new IOException("no serializable object");</span> } } /** * Decode. * * @param s the s * @return the object */ static Object decode(String s) { <span class="fc" id="L291"> byte[] bytes = Base64.base64ToByteArray(s);</span> ObjectInputStream objectInputStream; try { <span class="fc" id="L294"> objectInputStream = new ObjectInputStream(</span> new ByteArrayInputStream(bytes)); <span class="fc" id="L296"> return objectInputStream.readObject();</span> <span class="nc" id="L297"> } catch (IOException | ClassNotFoundException e) {</span> <span class="nc" id="L298"> log.error(e);</span> <span class="nc" id="L299"> return null;</span> } } /** * Decode. * * @param l the l * @return the array list */ @SuppressWarnings({ "rawtypes", "unchecked" }) static ArrayList decode(ArrayList l) { <span class="fc bfc" id="L311" title="All 2 branches covered."> for (int i = 0; i < l.size(); i++) {</span> <span class="pc bpc" id="L312" title="1 of 2 branches missed."> if (l.get(i) instanceof NamedList) {</span> <span class="fc" id="L313"> l.set(i, decode((NamedList) l.get(i)));</span> <span class="nc bnc" id="L314" title="All 2 branches missed."> } else if (l.get(i) instanceof ArrayList) {</span> <span class="nc" id="L315"> l.set(i, decode((ArrayList) l.get(i)));</span> } } <span class="fc" id="L318"> return l;</span> } /** * Decode. * * @param nl the nl * @return the named list */ @SuppressWarnings({ "rawtypes", "unchecked" }) static NamedList<Object> decode(NamedList<Object> nl) { <span class="fc bfc" id="L329" title="All 2 branches covered."> for (int i = 0; i < nl.size(); i++) {</span> <span class="fc" id="L330"> String key = nl.getName(i);</span> <span class="fc" id="L331"> Object o = nl.getVal(i);</span> <span class="fc bfc" id="L332" title="All 2 branches covered."> if (key.matches("^_encoded_.*$")) {</span> <span class="pc bpc" id="L333" title="1 of 2 branches missed."> if (o instanceof String) {</span> <span class="fc" id="L334"> Object decodedObject = decode((String) nl.getVal(i));</span> <span class="fc" id="L335"> String decodedKey = key.replaceFirst("^_encoded_", "");</span> <span class="pc bpc" id="L336" title="1 of 2 branches missed."> if (decodedKey.equals("")) {</span> <span class="nc" id="L337"> decodedKey = "_" + decodedObject.getClass().getSimpleName() + "_";</span> } <span class="fc" id="L339"> nl.setName(i, decodedKey);</span> <span class="fc" id="L340"> nl.setVal(i, decodedObject);</span> <span class="pc bnc" id="L341" title="All 2 branches missed."> } else if (o instanceof NamedList) {</span> <span class="nc" id="L342"> NamedList nl2 = (NamedList) o;</span> <span class="nc bnc" id="L343" title="All 2 branches missed."> for (int j = 0; j < nl2.size(); j++) {</span> <span class="nc bnc" id="L344" title="All 2 branches missed."> if (nl2.getVal(j) instanceof String) {</span> <span class="nc" id="L345"> nl2.setVal(j, decode((String) nl2.getVal(j)));</span> } } <span class="nc" id="L348"> } else {</span> // System.out.println("unknown type " + // o.getClass().getCanonicalName()); } } else { <span class="pc bpc" id="L353" title="1 of 2 branches missed."> if (o instanceof NamedList) {</span> <span class="nc" id="L354"> nl.setVal(i, decode((NamedList<Object>) o));</span> <span class="fc bfc" id="L355" title="All 2 branches covered."> } else if (o instanceof ArrayList) {</span> <span class="fc" id="L356"> nl.setVal(i, decode((ArrayList<Object>) o));</span> } } } <span class="fc" id="L360"> return nl;</span> } /** * Gets the ids from parameters. * * @param params the params * @param prefix the prefix * @return the ids from parameters */ public static SortedSet<String> getIdsFromParameters(SolrParams params, String prefix) { <span class="fc" id="L372"> SortedSet<String> ids = new TreeSet<>();</span> <span class="fc" id="L373"> Iterator<String> it = params.getParameterNamesIterator();</span> <span class="fc" id="L374"> Pattern pattern = Pattern</span> <span class="fc" id="L375"> .compile("^" + Pattern.quote(prefix) + "\\.([^\\.]+)(\\..*|$)");</span> <span class="fc bfc" id="L376" title="All 2 branches covered."> while (it.hasNext()) {</span> <span class="fc" id="L377"> String item = it.next();</span> <span class="fc" id="L378"> Matcher m = pattern.matcher(item);</span> <span class="fc bfc" id="L379" title="All 2 branches covered."> if (m.matches()) {</span> <span class="fc" id="L380"> ids.add(m.group(1));</span> } <span class="fc" id="L382"> }</span> <span class="fc" id="L383"> return ids;</span> } /** * Compare and check. * * @param list the list * @param original the original * @param nameNew the name new * @param nameOriginal the name original * @param unique the unique * @throws IOException Signals that an I/O exception has occurred. */ public static void compareAndCheck(String[] list, String[] original, String nameNew, String nameOriginal, Boolean unique) throws IOException { <span class="pc bpc" id="L398" title="1 of 2 branches missed."> if (list != null) {</span> <span class="pc bpc" id="L399" title="1 of 2 branches missed."> if (list.length != original.length) {</span> <span class="nc" id="L400"> throw new IOException(</span> "unequal size " + nameNew + " and " + nameOriginal); } <span class="fc bfc" id="L403" title="All 2 branches covered."> if (unique) {</span> <span class="fc" id="L404"> Set<String> set = new HashSet<>();</span> <span class="fc bfc" id="L405" title="All 2 branches covered."> for (int i = 0; i < list.length; i++) {</span> <span class="fc" id="L406"> set.add(list[i]);</span> } <span class="pc bpc" id="L408" title="1 of 2 branches missed."> if (set.size() < list.length) {</span> <span class="nc" id="L409"> throw new IOException("duplicate " + nameNew);</span> } } } <span class="fc" id="L413"> }</span> /** * Construct query. * * @param queryValue the query value * @param queryType the query type * @param queryPrefix the query prefix * @param queryVariables the query variables * @param field the field * @param queryIgnore the query ignore * @param maximumIgnoreLength the maximum ignore length * @return the mtas span query * @throws IOException Signals that an I/O exception has occurred. */ public static MtasSpanQuery constructQuery(String queryValue, String queryType, String queryPrefix, HashMap<String, String[]> queryVariables, String field, String queryIgnore, Integer maximumIgnoreLength) throws IOException { <span class="pc bpc" id="L432" title="2 of 4 branches missed."> if (queryType == null || queryType.isEmpty()) {</span> <span class="nc" id="L433"> throw new IOException("no (valid) type for query " + queryValue);</span> <span class="pc bpc" id="L434" title="2 of 4 branches missed."> } else if (queryValue == null || queryValue.isEmpty()) {</span> <span class="nc" id="L435"> throw new IOException("no (valid) value for " + queryType + " query");</span> } <span class="fc" id="L437"> MtasSpanQuery ignore = null;</span> <span class="pc bpc" id="L438" title="1 of 2 branches missed."> if (queryIgnore != null) {</span> <span class="nc" id="L439"> Reader queryIgnoreReader = new BufferedReader(</span> new StringReader(queryIgnore)); <span class="nc bnc" id="L441" title="All 2 branches missed."> if (queryType.equals(QUERY_TYPE_CQL)) {</span> <span class="nc" id="L442"> MtasCQLParser ip = new MtasCQLParser(queryIgnoreReader);</span> try { <span class="nc" id="L444"> ignore = ip.parse(field, null, null, null, null);</span> <span class="nc" id="L445"> } catch (mtas.parser.cql.ParseException e) {</span> <span class="nc" id="L446"> throw new IOException("couldn't parse " + queryType + " query "</span> <span class="nc" id="L447"> + queryIgnore + " (" + e.getMessage() + ")", e);</span> <span class="nc" id="L448"> } catch (TokenMgrError e) {</span> <span class="nc" id="L449"> throw new IOException("couldn't parse " + queryType + " query "</span> <span class="nc" id="L450"> + queryIgnore + " (" + e.getMessage() + ")", e);</span> <span class="nc" id="L451"> }</span> <span class="nc" id="L452"> } else {</span> <span class="nc" id="L453"> throw new IOException(</span> "unknown queryType " + queryType + " for query " + queryValue); } } <span class="fc" id="L457"> Reader queryValueReader = new BufferedReader(new StringReader(queryValue));</span> <span class="pc bpc" id="L458" title="1 of 2 branches missed."> if (queryType.equals(QUERY_TYPE_CQL)) {</span> <span class="fc" id="L459"> MtasCQLParser qp = new MtasCQLParser(queryValueReader);</span> try { <span class="fc" id="L461"> return qp.parse(field, queryPrefix, queryVariables, ignore,</span> maximumIgnoreLength); <span class="nc" id="L463"> } catch (mtas.parser.cql.ParseException e) {</span> <span class="nc" id="L464"> throw new IOException("couldn't parse " + queryType + " query "</span> <span class="nc" id="L465"> + queryValue + " (" + e.getMessage() + ")", e);</span> <span class="nc" id="L466"> } catch (TokenMgrError e) {</span> <span class="nc" id="L467"> throw new IOException("couldn't parse " + queryType + " query "</span> <span class="nc" id="L468"> + queryValue + " (" + e.getMessage() + ")", e);</span> } } else { <span class="nc" id="L471"> throw new IOException(</span> "unknown queryType " + queryType + " for query " + queryValue); } } } </pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.7.9.201702052155</span></div></body></html>