Example usage for org.apache.solr.request SolrQueryRequest getContext

List of usage examples for org.apache.solr.request SolrQueryRequest getContext

Introduction

In this page you can find the example usage for org.apache.solr.request SolrQueryRequest getContext.

Prototype

Map<Object, Object> getContext();

Source Link

Document

Generic information associated with this request that may be both read and updated.

Usage

From source file:alba.solr.common.MySimpleFloatFunction.java

License:Apache License

@SolrRequestHandler(name = "functions", value = "/functions.alba")
public List<CallableFunction> functions(SolrQueryRequest req, SolrQueryResponse rsp) {

    List<CallableFunction> list = new ArrayList<CallableFunction>();

    Map<String, CallableFunction> functions = (Map<String, CallableFunction>) req.getContext()
            .get(Loader.FUNCTIONS);/*from ww w .j  a v a  2 s  .c  o m*/

    if (functions == null) {
        logger.error("functions null!");
    }

    for (String s : functions.keySet()) {
        list.add(functions.get(s));
    }

    return list;

}

From source file:alba.solr.core.DynamicQueryParser.java

License:Apache License

@Override
public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {

    postFilters = (Map<String, CallableFunction>) req.getContext().get(Loader.POSTFILTERS);

    cachedResults = (Map<Object, CachedResult>) req.getContext().get(Loader.CACHEDRESULTS);

    CallableFunction function = postFilters.get(localParams.get("name"));

    return new QParser(qstr, localParams, params, req) {

        private ValueSource functionParamValueSource;

        @Override//from   ww w . jav  a  2 s .c om
        public Query parse() throws SyntaxError {

            ValueSource vs = null;

            Map<String, Object> params = new HashMap<String, Object>();

            String funcStr = localParams.get(QueryParsing.V, null);

            int nParams = 1;

            if ((function != null) && (function.getMethod() != null)) {
                nParams = function.getMethod().getParameterCount();
            }

            boolean cache = false;

            Object functionParams[] = new Object[nParams];

            int i = 1; //in the 0th positions there's the parametric function result (as ValueSource)
            Iterator<String> it = localParams.getParameterNamesIterator();
            while (it.hasNext()) {
                String p = it.next();

                /* does it make sense to be able to switch on/off the cache? what would it imply? 
                if ("cache".equals(p)) {
                   cache = ("1".equals(localParams.get(p)));
                }
                */

                if (!"v".equals(p) && !"cache".equals(p) && !"type".equals(p) && !"name".equals(p)) {
                    params.put(p, localParams.get(p));

                    Class<?> expectedType = function.getMethod().getParameters()[i].getType();
                    if (expectedType == Integer.class) {
                        functionParams[i] = Integer.parseInt(localParams.get(p));
                    } else {
                        logger.error("param " + i + " should be of type " + expectedType
                                + " but I don't know how to parse it.");
                        // right place for magic params? like passing the request & so on.. ?
                    }

                    i++;
                }
            }

            if ((funcStr != null) && (funcStr != "")) {
                Query funcQ = subQuery(funcStr, FunctionQParserPlugin.NAME).getQuery();

                //if (funcQ instanceof FunctionQuery) {  //what else could be?
                vs = ((FunctionQuery) funcQ).getValueSource();
                functionParamValueSource = vs; //todo must call getValues when using it!

            } else {
                logger.error("!!!! no function defined for the postfilter???");
            }

            DynamicQuery dq = new DynamicQuery(vs, cache, function, functionParams, cachedResults);

            dq.setParams(params);

            return dq;
        }
    };
}

From source file:alba.solr.searchcomponents.AlbaRequestHandler.java

License:Apache License

public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
    // TODO Auto-generated method stub

    /* List<SearchComponent> components = new ArrayList<SearchComponent>();
            // w  ww  .ja  va  2s  .c om
    MySearchComponent msc = new MySearchComponent();
            
    ResponseBuilder rb = new ResponseBuilder(req, rsp, components);
            
    msc.process(rb);*/

    //rsp.add("hello", rb.rsp.getValues());

    req.getContext().put(Loader.FUNCTIONS, functions);

    Object params[] = new Object[2];

    params[0] = req;
    params[1] = rsp;

    // what if this method calls rsp.add( .. ) ????
    Object result = this.function.getMethod().invoke(this.function.getInstance(), params);

    if (Map.class.isAssignableFrom(result.getClass())) {
        // if we got a Map, just return it as-is
        rsp.add(this.sectionName, result);
    } else // if we got anything else, try to serialize it!
    if (List.class.isAssignableFrom(result.getClass())) {
        for (Object o : (List) result) {
            DocumentObjectBinder dob = new DocumentObjectBinder();
            SolrInputDocument sd = dob.toSolrInputDocument(o);
            SolrDocument dest = ClientUtils.toSolrDocument(sd);

            HashMap<Object, Object> nl = (HashMap<Object, Object>) dest.get("functionDescriptor");

            //rsp.add(nl.get("name").toString(), dest2);

            rsp.add(null, dest);
        }
    }
    if (StaticResource.class.isAssignableFrom(result.getClass())) {
        FilteredShowFileRequestHandler file = new FilteredShowFileRequestHandler();

        file.init(new NamedList()); //to initialize internal variables - but in this way it will NOT get the proper configuration from SolrConfig!

        ModifiableSolrParams solrParams = new ModifiableSolrParams(req.getParams());

        StaticResource resource = ((StaticResource) result);
        solrParams.set("file", resource.getName());
        //TODO Proper mapping here!!
        //solrParams.set("contentType", "text/xml;charset=utf-8");

        solrParams.set("contentType", resource.getContentType());
        req.setParams(solrParams);

        file.handleRequest(req, rsp);
        //   logger.error("returning the content of " + );
    } else {
        // unable to do any kind of serialization.. just add the result and let the ResponseWriter handle it
        rsp.add(null, result);
    }

}

From source file:alba.solr.transformers.Transformer.java

License:Apache License

@SuppressWarnings("unchecked")
@Override//ww  w  . j  av a 2s. c o m
public TransformerWithContext create(String field, SolrParams params, SolrQueryRequest req) {
    // TODO Auto-generated method stub
    Logger logger = LoggerFactory.getLogger(this.getClass().getName());

    transformers = (Map<String, CallableFunction>) req.getContext().get(Loader.DOCTRANSFORMERS);

    String name = params.get("name");

    if (name == null) {
        logger.error("no param name found for transformer " + this.getClass().getName());
        return null;
    }

    CallableFunction function = transformers.get(name);

    if (function == null) {
        logger.error("no mapped function found for transformer " + name);
    }

    PluggableDocTransformer docTransformer = new PluggableDocTransformer(function);

    docTransformer.context = req.getContext();

    return docTransformer;
}

From source file:lux.solr.LuxResponseWriter.java

License:Mozilla Public License

@Override
public String getContentType(SolrQueryRequest request, SolrQueryResponse response) {
    String contentType = (String) request.getContext().get("lux.contentType");
    if (contentType == null) {
        contentType = request.getParams().get("lux.contentType");
    }//from  w  w w.j a v a 2  s . com
    if (contentType != null) {
        return contentType;
    } else {
        return "text/html; charset=UTF-8";
    }
}

From source file:lux.solr.XQueryComponent.java

License:Mozilla Public License

private String handleEXPathResponse(SolrQueryRequest req, SolrQueryResponse rsp, NamedList<Object> xpathResults,
        XdmItem xpathResult) {/*  ww w  .  j av  a  2  s .  com*/
    XdmNode expathResponse;
    expathResponse = (XdmNode) xpathResult;
    HttpServletRequest httpReq = (HttpServletRequest) req.getContext()
            .get(SolrQueryContext.LUX_HTTP_SERVLET_REQUEST);
    HttpServletResponse httpResp = (HttpServletResponse) httpReq
            .getAttribute(SolrQueryContext.LUX_HTTP_SERVLET_RESPONSE);
    TinyElementImpl responseNode = (TinyElementImpl) expathResponse.getUnderlyingNode();
    // Get the status code and message
    String status = responseNode.getAttributeValue("", "status");
    String message = responseNode.getAttributeValue("", "message");
    int istatus = 200;
    if (status != null) {
        try {
            istatus = Integer.parseInt(status);
        } catch (NumberFormatException e) {
            throw new LuxException("Non-numeric response status code: " + status);
        }
        if (istatus >= 400) {
            try {
                if (message != null) {
                    httpResp.sendError(istatus, message);
                } else {
                    httpResp.sendError(istatus);
                }
            } catch (IOException e) {
                logger.error("sendError failed: " + e.getMessage());
            }
        }
        // if an error is generated by the query, call sendError?
        httpResp.setStatus(istatus);
    }
    // Get the body, its charset and content-type and return the body to be used as the result
    XdmSequenceIterator children = expathResponse.axisIterator(Axis.CHILD);
    while (children.hasNext()) {
        XdmNode child = (XdmNode) children.next();
        net.sf.saxon.s9api.QName childName = child.getNodeName();
        if (!childName.getNamespaceURI().equals(EXPATH_HTTP_NS)) {
            logger.warn("ignoring unknown response child element: " + childName.getClarkName());
            continue;
        }
        if (childName.getLocalName().equals("body")) {
            // got the body
            String src = child.getAttributeValue(qnameFor("src"));
            if (src != null) {
                throw new LuxException("The body/@src attribute is not supported");
            }
            String characterSet = child.getAttributeValue(qnameFor("charset"));
            if (characterSet == null) {
                characterSet = "utf-8";
            }
            String contentType = child.getAttributeValue(qnameFor("content-type"));
            if (contentType != null) {
                contentType += "; charset=" + characterSet;
            }
            if (contentType == null) {
                contentType = req.getParams().get("lux.contentType", contentType);
                if (contentType != null) {
                    contentType = contentType.replaceFirst("(?<=; charset=).*", characterSet);
                }
            }
            if (contentType != null) {
                req.getContext().put("lux.contentType", contentType);
            }
            XdmSequenceIterator bodyKids = child.axisIterator(Axis.CHILD);
            while (bodyKids.hasNext()) {
                XdmNode result = (XdmNode) bodyKids.next();
                String err = safeAddResult(xpathResults, result);
                if (err != null) {
                    return err;
                }
            }
        } else if (childName.getLocalName().equals("header")) {
            String header = child.getAttributeValue(qnameFor("name"));
            String value = child.getAttributeValue(qnameFor("value"));
            httpResp.addHeader(header, value);
        } else if (childName.getLocalName().equals("multipart")) {
            throw new LuxException("Multipart HTTP responses not implemented");
        }
    }
    /*
    if (istatus >= 300 && istatus < 400) {
    httpResp.sendRedirect(location);
    }
    */
    if (expathResponse != null) {
        // TODO: pass the expathResponse to the LuxResponseWriter -- why?
        req.getContext().put("expath:response", expathResponse);
    }
    return null;
}

From source file:lux.solr.XQueryComponent.java

License:Mozilla Public License

private String buildHttpInfo(SolrQueryRequest req) {
    StringBuilder buf = new StringBuilder();
    buf.append(String.format("<http>"));
    buf.append("<params>");
    SolrParams params = req.getParams();
    Iterator<String> paramNames = params.getParameterNamesIterator();
    while (paramNames.hasNext()) {
        String param = paramNames.next();
        if (param.startsWith("lux.")) {
            continue;
        }//from  w  w  w . ja  va2s  .com
        buf.append(String.format("<param name=\"%s\">", param));
        String[] values = params.getParams(param);
        for (String value : values) {
            buf.append(String.format("<value>%s</value>", xmlEscape(value)));
        }
        buf.append("</param>");
    }
    buf.append("</params>");
    String pathInfo = params.get(LUX_PATH_INFO);
    if (pathInfo != null) {
        buf.append("<path-info>").append(xmlEscape(pathInfo)).append("</path-info>");
    }
    Map<Object, Object> context = req.getContext();
    String webapp = (String) context.get("webapp");
    if (webapp == null) {
        webapp = "";
    }
    buf.append("<context-path>").append(webapp).append("</context-path>");
    // TODO: headers, path, etc?
    buf.append("</http>");
    return buf.toString();
}

From source file:lux.solr.XQueryComponent.java

License:Mozilla Public License

private XdmValue buildEXPathRequest(Compiler compiler, Evaluator evaluator, SolrQueryRequest req)
        throws XPathException {
    LinkedTreeBuilder builder = new LinkedTreeBuilder(
            compiler.getProcessor().getUnderlyingConfiguration().makePipelineConfiguration());
    builder.startDocument(0);//from  w w w. jav a 2s . c o m
    builder.startElement(fQNameFor("http", EXPATH_HTTP_NS, "request"), AnyType.getInstance(), 0, 0);
    builder.namespace(new NamespaceBinding("http", EXPATH_HTTP_NS), 0);
    Request requestWrapper = (Request) req.getContext().get(SolrQueryContext.LUX_HTTP_SERVLET_REQUEST);
    addAttribute(builder, "method", requestWrapper.getMethod());
    addAttribute(builder, "servlet", requestWrapper.getServletPath());
    HttpServletRequest httpReq = (HttpServletRequest) requestWrapper.getRequest();
    addAttribute(builder, "path", httpReq.getServletPath());
    String pathInfo = requestWrapper.getPathInfo();
    if (pathInfo != null) {
        addAttribute(builder, "path-info", pathInfo);
    }
    builder.startContent();

    // child elements

    StringBuilder buf = new StringBuilder();

    // authority
    buf.append(requestWrapper.getScheme()).append("://").append(requestWrapper.getServerName()).append(':')
            .append(requestWrapper.getServerPort());
    String authority = buf.toString();
    addSimpleElement(builder, "authority", authority);

    // url
    buf.append(httpReq.getServletPath());
    if (httpReq.getQueryString() != null) {
        buf.append('?').append(httpReq.getQueryString());
    }
    String url = buf.toString();
    addSimpleElement(builder, "url", url);

    // context-root
    addSimpleElement(builder, "context-root", httpReq.getContextPath());

    // path - just one part: we don't do any parsing of the path
    builder.startElement(fQNameFor("http", EXPATH_HTTP_NS, "path"), BuiltInAtomicType.UNTYPED_ATOMIC, 0, 0);
    builder.startContent();
    addSimpleElement(builder, "part", httpReq.getServletPath());
    builder.endElement();

    // params
    Iterator<String> paramNames = req.getParams().getParameterNamesIterator();
    while (paramNames.hasNext()) {
        String param = paramNames.next();
        String[] values = req.getParams().getParams(param);
        for (String value : values) {
            builder.startElement(fQNameFor("http", EXPATH_HTTP_NS, "param"), BuiltInAtomicType.UNTYPED_ATOMIC,
                    0, 0);
            addAttribute(builder, "name", param);
            addAttribute(builder, "value", value);
            builder.startContent();
            builder.endElement();
        }
    }

    // headers
    Enumeration<String> headerNames = httpReq.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String headerName = headerNames.nextElement();
        Enumeration<String> headerValues = httpReq.getHeaders(headerName);
        while (headerValues.hasMoreElements()) {
            String value = headerValues.nextElement();
            builder.startElement(fQNameFor("http", EXPATH_HTTP_NS, "header"), BuiltInAtomicType.UNTYPED_ATOMIC,
                    0, 0);
            addAttribute(builder, "name", headerName);
            addAttribute(builder, "value", value);
            builder.startContent();
            builder.endElement();
        }
    }
    ArrayList<XdmItem> resultSequence = null;
    if (req.getContentStreams() != null) {
        resultSequence = new ArrayList<XdmItem>();
        handleContentStreams(builder, req, resultSequence, evaluator);
    }
    builder.endElement(); // end request
    builder.endDocument();
    XdmNode expathReq = new XdmNode(builder.getCurrentRoot());
    if (resultSequence == null) {
        return expathReq;
    }
    resultSequence.add(0, expathReq);
    return new XdmValue(resultSequence);
}

From source file:net.yacy.cora.federate.solr.connector.EmbeddedSolrConnector.java

License:Open Source License

/**
 * get a new query request. MUST be closed after usage using close()
 * @param params/* w  w  w  .  ja  v a  2  s  . c  o m*/
 * @return
 */
public SolrQueryRequest request(final SolrParams params) {
    SolrQueryRequest req = new SolrQueryRequestBase(this.core, params) {
    };
    req.getContext().put("path", SELECT);
    req.getContext().put("webapp", CONTEXT);
    return req;
}

From source file:net.yacy.cora.federate.solr.responsewriter.GSAResponseWriter.java

License:Open Source License

@Override
public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp)
        throws IOException {
    assert rsp.getValues().get("responseHeader") != null;
    assert rsp.getValues().get("response") != null;

    long start = System.currentTimeMillis();

    SimpleOrderedMap<Object> responseHeader = (SimpleOrderedMap<Object>) rsp.getResponseHeader();
    DocList response = ((ResultContext) rsp.getValues().get("response")).docs;
    @SuppressWarnings("unchecked")
    SimpleOrderedMap<Object> highlighting = (SimpleOrderedMap<Object>) rsp.getValues().get("highlighting");
    Map<String, LinkedHashSet<String>> snippets = OpensearchResponseWriter.highlighting(highlighting);
    Map<Object, Object> context = request.getContext();

    // parse response header
    ResHead resHead = new ResHead();
    NamedList<?> val0 = (NamedList<?>) responseHeader.get("params");
    resHead.rows = Integer.parseInt((String) val0.get(CommonParams.ROWS));
    resHead.offset = response.offset(); // equal to 'start'
    resHead.numFound = response.matches();
    //resHead.df = (String) val0.get("df");
    //resHead.q = (String) val0.get("q");
    //resHead.wt = (String) val0.get("wt");
    //resHead.status = (Integer) responseHeader.get("status");
    //resHead.QTime = (Integer) responseHeader.get("QTime");
    //resHead.maxScore = response.maxScore();

    // write header
    writer.write(XML_START);//  ww w . j  a v a 2 s.c  o  m
    String query = request.getParams().get("originalQuery");
    String site = getContextString(context, "site", "");
    String sort = getContextString(context, "sort", "");
    String client = getContextString(context, "client", "");
    String ip = getContextString(context, "ip", "");
    String access = getContextString(context, "access", "");
    String entqr = getContextString(context, "entqr", "");
    OpensearchResponseWriter.solitaireTag(writer, "TM", Long.toString(System.currentTimeMillis() - start));
    OpensearchResponseWriter.solitaireTag(writer, "Q", query);
    paramTag(writer, "sort", sort);
    paramTag(writer, "output", "xml_no_dtd");
    paramTag(writer, "ie", "UTF-8");
    paramTag(writer, "oe", "UTF-8");
    paramTag(writer, "client", client);
    paramTag(writer, "q", query);
    paramTag(writer, "site", site);
    paramTag(writer, "start", Integer.toString(resHead.offset));
    paramTag(writer, "num", Integer.toString(resHead.rows));
    paramTag(writer, "ip", ip);
    paramTag(writer, "access", access); // p - search only public content, s - search only secure content, a - search all content, both public and secure
    paramTag(writer, "entqr", entqr); // query expansion policy; (entqr=1) -- Uses only the search appliance's synonym file, (entqr=1) -- Uses only the search appliance's synonym file, (entqr=3) -- Uses both standard and local synonym files.

    // body introduction
    final int responseCount = response.size();
    writer.write("<RES SN=\"" + (resHead.offset + 1) + "\" EN=\"" + (resHead.offset + responseCount) + "\">");
    writer.write(lb); // The index (1-based) of the first and last search result returned in this result set.
    writer.write("<M>" + resHead.numFound + "</M>");
    writer.write(lb); // The estimated total number of results for the search.
    writer.write("<FI/>");
    writer.write(lb); // Indicates that document filtering was performed during this search.
    int nextStart = resHead.offset + responseCount;
    int nextNum = Math.min(resHead.numFound - nextStart, responseCount < resHead.rows ? 0 : resHead.rows);
    int prevStart = resHead.offset - resHead.rows;
    if (prevStart >= 0 || nextNum > 0) {
        writer.write("<NB>");
        if (prevStart >= 0) {
            writer.write("<PU>");
            XML.escapeCharData("/gsa/search?q=" + request.getParams().get(CommonParams.Q) + "&site=" + site
                    + "&lr=&ie=UTF-8&oe=UTF-8&output=xml_no_dtd&client=" + client + "&access=" + access
                    + "&sort=" + sort + "&start=" + prevStart + "&sa=N", writer); // a relative URL pointing to the NEXT results page.
            writer.write("</PU>");
        }
        if (nextNum > 0) {
            writer.write("<NU>");
            XML.escapeCharData("/gsa/search?q=" + request.getParams().get(CommonParams.Q) + "&site=" + site
                    + "&lr=&ie=UTF-8&oe=UTF-8&output=xml_no_dtd&client=" + client + "&access=" + access
                    + "&sort=" + sort + "&start=" + nextStart + "&num=" + nextNum + "&sa=N", writer); // a relative URL pointing to the NEXT results page.
            writer.write("</NU>");
        }
        writer.write("</NB>");
    }
    writer.write(lb);

    // parse body
    SolrIndexSearcher searcher = request.getSearcher();
    DocIterator iterator = response.iterator();
    String urlhash = null;
    for (int i = 0; i < responseCount; i++) {
        int id = iterator.nextDoc();
        Document doc = searcher.doc(id, SOLR_FIELDS);
        List<IndexableField> fields = doc.getFields();

        // pre-scan the fields to get the mime-type            
        String mime = "";
        for (IndexableField value : fields) {
            String fieldName = value.name();
            if (CollectionSchema.content_type.getSolrFieldName().equals(fieldName)) {
                mime = value.stringValue();
                break;
            }
        }

        // write the R header for a search result
        writer.write("<R N=\"" + (resHead.offset + i + 1) + "\"" + (i == 1 ? " L=\"2\"" : "")
                + (mime != null && mime.length() > 0 ? " MIME=\"" + mime + "\"" : "") + ">");
        writer.write(lb);
        //List<String> texts = new ArrayList<String>();
        List<String> descriptions = new ArrayList<String>();
        List<String> collections = new ArrayList<String>();
        int size = 0;
        boolean title_written = false; // the solr index may contain several; we take only the first which should be the visible tag in <title></title>
        String title = null;
        for (IndexableField value : fields) {
            String fieldName = value.name();

            // apply generic matching rule
            String stag = field2tag.get(fieldName);
            if (stag != null) {
                OpensearchResponseWriter.solitaireTag(writer, stag, value.stringValue());
                continue;
            }

            // if the rule is not generic, use the specific here
            if (CollectionSchema.id.getSolrFieldName().equals(fieldName)) {
                urlhash = value.stringValue();
                continue;
            }
            if (CollectionSchema.sku.getSolrFieldName().equals(fieldName)) {
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.U.name(), value.stringValue());
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.UE.name(), value.stringValue());
                continue;
            }
            if (CollectionSchema.title.getSolrFieldName().equals(fieldName) && !title_written) {
                title = value.stringValue();
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.T.name(), highlight(title, query));
                //texts.add(value.stringValue());
                title_written = true;
                continue;
            }
            if (CollectionSchema.description_txt.getSolrFieldName().equals(fieldName)) {
                descriptions.add(value.stringValue());
                //texts.adds(description);
                continue;
            }
            if (CollectionSchema.last_modified.getSolrFieldName().equals(fieldName)) {
                Date d = new Date(Long.parseLong(value.stringValue()));
                writer.write("<FS NAME=\"date\" VALUE=\"" + HeaderFramework.formatGSAFS(d) + "\"/>\n");
                //OpensearchResponseWriter.solitaireTag(writer, GSAToken.CACHE_LAST_MODIFIED.getSolrFieldName(), HeaderFramework.formatRFC1123(d));
                //texts.add(value.stringValue());
                continue;
            }
            if (CollectionSchema.load_date_dt.getSolrFieldName().equals(fieldName)) {
                Date d = new Date(Long.parseLong(value.stringValue()));
                OpensearchResponseWriter.solitaireTag(writer, GSAToken.CRAWLDATE.name(),
                        HeaderFramework.formatRFC1123(d));
                //texts.add(value.stringValue());
                continue;
            }
            if (CollectionSchema.size_i.getSolrFieldName().equals(fieldName)) {
                size = value.stringValue() != null && value.stringValue().length() > 0
                        ? Integer.parseInt(value.stringValue())
                        : -1;
                continue;
            }
            if (CollectionSchema.collection_sxt.getSolrFieldName().equals(fieldName)) {
                collections.add(value.stringValue());
                continue;
            }
            //System.out.println("superfluous field: " + fieldName + ": " + value.stringValue()); // this can be avoided setting the enableLazyFieldLoading = false in solrconfig.xml
        }
        // compute snippet from texts
        LinkedHashSet<String> snippet = urlhash == null ? null : snippets.get(urlhash);
        OpensearchResponseWriter.removeSubsumedTitle(snippet, title);
        OpensearchResponseWriter.solitaireTag(writer, GSAToken.S.name(),
                snippet == null || snippet.size() == 0 ? (descriptions.size() > 0 ? descriptions.get(0) : "")
                        : OpensearchResponseWriter.getLargestSnippet(snippet));
        OpensearchResponseWriter.solitaireTag(writer, GSAToken.GD.name(),
                descriptions.size() > 0 ? descriptions.get(0) : "");
        String cols = collections.toString();
        if (collections.size() > 0)
            OpensearchResponseWriter.solitaireTag(writer, "COLS" /*SPECIAL!*/,
                    collections.size() > 1 ? cols.substring(1, cols.length() - 1).replaceAll(" ", "")
                            : collections.get(0));
        writer.write("<HAS><L/><C SZ=\"");
        writer.write(Integer.toString(size / 1024));
        writer.write("k\" CID=\"");
        writer.write(urlhash);
        writer.write("\" ENC=\"UTF-8\"/></HAS>\n");
        if (YaCyVer == null)
            YaCyVer = yacyVersion.thisVersion().getName() + "/"
                    + Switchboard.getSwitchboard().peers.mySeed().hash;
        OpensearchResponseWriter.solitaireTag(writer, GSAToken.ENT_SOURCE.name(), YaCyVer);
        OpensearchResponseWriter.closeTag(writer, "R");
    }
    writer.write("</RES>");
    writer.write(lb);
    writer.write(XML_STOP);
}