// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.templates;
import com.yahoo.container.ConfigHack;
import com.yahoo.prelude.templates.FormattingOptions.SubtypeFieldWithPrefix;
import com.yahoo.search.Result;
import com.yahoo.search.pagetemplates.model.Renderer;
import com.yahoo.search.pagetemplates.model.Source;
import com.yahoo.search.pagetemplates.result.SectionHitGroup;
import com.yahoo.search.result.Hit;
import com.yahoo.search.result.HitGroup;
import com.yahoo.text.XMLWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.Map;
/**
* A template set which implements the 'tiled' format.
*
* This template implementation requires a few rules to be observed for it to work properly:
*
* Field | Formatting | Field type |
* provider | name attribute of <provider> tag | Provided by container |
* scheme | scheme attribute of <provider> tag | Provided by container |
* host | host attribute of <provider> tag | Provided by container |
* port | port attribute of <provider> tag | Provided by container |
* path | path attribute of <provider> tag | Provided by container |
* status | result attribute of <provider> tag | Provided by container |
* latency_connect | <latency type="connect"> tag | Provided by container |
* latency_start | <latency type="start"> tag | Provided by container |
* latency_finish | <latency type="finish"> tag | Provided by container |
* query_param_* | <parameter name="..."> tag | Provided by container |
* header_* | <header name="..."> tag | Provided by container |
* response_header_* | <response-header name="..."> tag | Provided by container |
* count_first | <count type="first"> tag | Provided by container |
* count_last | <count type="last"> tag | Provided by container |
* count_total | <count type="total"> tag | Provided by container |
* count_deep | <count type="deep"> tag | Provided by container |
* queryattrs_xorronum | <queryattrs name="xorronum"> tag | Provided by YST searcher |
* queryattrs_RankFeaturesRewriterAttr | <queryattrs name="RankFeaturesRewriterAttr"> tag | Provided by YST searcher |
* queryattrs_intlannotator | <queryattrs name="intlannotator"> tag | Provided by YST searcher |
* queryattrs_category | <queryattrs name="category"> tag | Provided by YST searcher |
* wordcounts_* | <wordcounts word="..."> tag | Provided by YST searcher |
*
*
* @author bratseth
* @author laboisse
*/
public class TiledTemplateSet extends DefaultTemplateSet {
private FormattingOptions hitOptionsForProvider;
private FormattingOptions hitOptions;
public TiledTemplateSet() {
this(ConfigHack.TILED_TEMPLATE);
}
public TiledTemplateSet(String templateName) {
super(templateName);
// Define formatting options that will be used by various rendering methods
hitOptions = new FormattingOptions();
// Render provider field as an attribute, not as a regular field
hitOptions.formatFieldAsAttribute("provider", "provider");
hitOptions.setFieldNotToRender("provider");
// Define formatting options that will be used by various rendering methods, for /result/meta/provider tags
hitOptionsForProvider = new FormattingOptions();
hitOptionsForProvider.formatFieldAsAttribute("provider", "name"); // Provider name is rendered a provider/@name
// hitOptionsForProvider.formatFieldAsAttribute("uri", "query"); // FIXME Issue with attribute formatting, keeping as regular field for now
hitOptionsForProvider.formatFieldAsAttribute("scheme", "scheme");
hitOptionsForProvider.formatFieldAsAttribute("host", "host");
hitOptionsForProvider.formatFieldAsAttribute("port", "port");
hitOptionsForProvider.formatFieldAsAttribute("path", "path");
hitOptionsForProvider.formatFieldAsAttribute("status", "result");
// Latency fields are not defined using prefixes as we know all the field names and prefixes are expensive
hitOptionsForProvider.formatFieldWithSubtype("latency_connect", "latency", "type", "connect");
hitOptionsForProvider.formatFieldWithSubtype("latency_start", "latency", "type", "start");
hitOptionsForProvider.formatFieldWithSubtype("latency_finish", "latency", "type", "finish");
// Must use prefix for query parameters
hitOptionsForProvider.formatFieldWithSubtype("query_param_", "parameter", "name");
// Must use prefix for getHeaders
hitOptionsForProvider.formatFieldWithSubtype("header_", "header", "name");
// Must use prefix for response getHeaders
hitOptionsForProvider.formatFieldWithSubtype("response_header_", "response-header", "name");
// Count fields are not defined using prefixes as we know all the field names and prefixes are expensive
hitOptionsForProvider.formatFieldWithSubtype("count_first", "count", "type", "first");
hitOptionsForProvider.formatFieldWithSubtype("count_last", "count", "type", "last");
hitOptionsForProvider.formatFieldWithSubtype("count_total", "count", "type", "total");
hitOptionsForProvider.formatFieldWithSubtype("count_deep", "count", "type", "deep");
hitOptionsForProvider.formatFieldWithSubtype("queryattrs_xorronum", "queryattrs", "name", "xorronum");
hitOptionsForProvider.formatFieldWithSubtype("queryattrs_RankFeaturesRewriterAttr", "queryattrs", "name", "RankFeaturesRewriterAttr");
hitOptionsForProvider.formatFieldWithSubtype("queryattrs_intlannotator", "queryattrs", "name", "intlannotator");
hitOptionsForProvider.formatFieldWithSubtype("queryattrs_category", "queryattrs", "name", "category");
hitOptionsForProvider.formatFieldWithSubtype("wordcounts_", "wordcounts", "word");
// Provider field should not be rendered in logging hits as we already have