diff options
32 files changed, 779 insertions, 514 deletions
diff --git a/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java b/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java index 7907bb27a6d..63cce619333 100644 --- a/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java +++ b/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java @@ -218,7 +218,7 @@ public abstract class AsynchronousSectionedRenderer<RESPONSE extends Response> e public final ListenableFuture<Boolean> renderBeforeHandover(OutputStream stream, RESPONSE response, Execution execution, Request request) { beforeHandoverMode = true; - if (!isInitialized) throw new IllegalStateException("render() invoked before init()."); + if ( ! isInitialized) throw new IllegalStateException("render() invoked before init()."); return startRender(stream, response, execution, request); } diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/DefaultTemplateSet.java b/container-search/src/main/java/com/yahoo/prelude/templates/DefaultTemplateSet.java index 7fc82ba4622..4d6406fe00d 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/DefaultTemplateSet.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/DefaultTemplateSet.java @@ -197,7 +197,6 @@ public class DefaultTemplateSet extends UserTemplate<XMLWriter> { } } - /** * Renders a hit group. */ diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/PageTemplateSet.java b/container-search/src/main/java/com/yahoo/prelude/templates/PageTemplateSet.java index d5de6fa597e..cac06011679 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/PageTemplateSet.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/PageTemplateSet.java @@ -18,7 +18,7 @@ import java.io.Writer; */ @SuppressWarnings("deprecation") // TODO: Remove on Vespa 7 -@Deprecated +@Deprecated // OK public class PageTemplateSet extends TiledTemplateSet { public PageTemplateSet() { diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/SearchRendererAdaptor.java b/container-search/src/main/java/com/yahoo/prelude/templates/SearchRendererAdaptor.java index 8439dd105a8..467cd615ebd 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/SearchRendererAdaptor.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/SearchRendererAdaptor.java @@ -24,7 +24,8 @@ import java.util.Iterator; * @deprecated do not use */ @SuppressWarnings({ "rawtypes", "deprecation", "unchecked" }) -@Deprecated // TODO: Remove on Vespa 7 +@Deprecated // OK (But wait for deprecated handlers in vespaclient-container-plugin to be removed) +// TODO: Remove on Vespa 7 public final class SearchRendererAdaptor extends Renderer { private final LogExceptionUserTemplateDelegator templates; diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/Template.java b/container-search/src/main/java/com/yahoo/prelude/templates/Template.java index 3d00be9d05b..761eb1db562 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/Template.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/Template.java @@ -13,7 +13,8 @@ import java.io.Writer; * @deprecated use a Renderer instead */ @SuppressWarnings("deprecation") -@Deprecated // TODO: Remove on Vespa 7 +@Deprecated // OK (But wait for deprecated handlers in vespaclient-container-plugin to be removed) +// TODO: Remove on Vespa 7 public abstract class Template<T extends Writer> { /** diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/TemplateSet.java b/container-search/src/main/java/com/yahoo/prelude/templates/TemplateSet.java index 98c7af6b9ce..65a5b4cacfd 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/TemplateSet.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/TemplateSet.java @@ -21,7 +21,8 @@ import java.io.Writer; * @deprecated use a renderer instead */ @SuppressWarnings("deprecation") -@Deprecated // TODO: Remove on Vespa 7 +@Deprecated // OK (But wait for deprecated handlers in vespaclient-container-plugin to be removed) +// TODO: Remove on Vespa 7 public class TemplateSet<T extends Writer> extends UserTemplate<T> { private static final String queryContextTemplateName = "queryContext"; diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/TiledTemplateSet.java b/container-search/src/main/java/com/yahoo/prelude/templates/TiledTemplateSet.java index 91bc33e3e2a..115e9cd44a1 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/TiledTemplateSet.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/TiledTemplateSet.java @@ -73,7 +73,8 @@ import java.util.stream.Collectors; * @deprecated use a Renderer instead */ @SuppressWarnings("deprecation") -@Deprecated // TODO: Remove on Vespa 7 +// TODO: Remove on Vespa 7 +@Deprecated // OK public class TiledTemplateSet extends DefaultTemplateSet { private FormattingOptions hitOptionsForProvider; diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/UserTemplate.java b/container-search/src/main/java/com/yahoo/prelude/templates/UserTemplate.java index ac1583b0577..bcdf3311c1f 100644 --- a/container-search/src/main/java/com/yahoo/prelude/templates/UserTemplate.java +++ b/container-search/src/main/java/com/yahoo/prelude/templates/UserTemplate.java @@ -24,7 +24,8 @@ import java.util.logging.Logger; * @author Steinar Knutsen */ @SuppressWarnings("deprecation") -@Deprecated // TODO: Remove on Vespa 7 +@Deprecated // OK (But wait for deprecated handlers in vespaclient-container-plugin to be removed) +// TODO: Remove on Vespa 7 public abstract class UserTemplate<T extends Writer> extends GenericTemplateSet { // & diff --git a/container-search/src/main/java/com/yahoo/search/pagetemplates/result/PageTemplatesXmlRenderer.java b/container-search/src/main/java/com/yahoo/search/pagetemplates/result/PageTemplatesXmlRenderer.java new file mode 100644 index 00000000000..b7d7188e77e --- /dev/null +++ b/container-search/src/main/java/com/yahoo/search/pagetemplates/result/PageTemplatesXmlRenderer.java @@ -0,0 +1,334 @@ +package com.yahoo.search.pagetemplates.result; + +import com.yahoo.io.ByteWriter; +import com.yahoo.prelude.fastsearch.GroupingListHit; +import com.yahoo.prelude.hitfield.HitField; +import com.yahoo.prelude.hitfield.JSONString; +import com.yahoo.prelude.hitfield.XMLString; +import com.yahoo.processing.rendering.AsynchronousSectionedRenderer; +import com.yahoo.processing.response.Data; +import com.yahoo.processing.response.DataList; +import com.yahoo.search.Query; +import com.yahoo.search.Result; +import com.yahoo.search.pagetemplates.model.Renderer; +import com.yahoo.search.pagetemplates.model.Source; +import com.yahoo.search.query.context.QueryContext; +import com.yahoo.search.result.Coverage; +import com.yahoo.search.result.DefaultErrorHit; +import com.yahoo.search.result.ErrorHit; +import com.yahoo.search.result.ErrorMessage; +import com.yahoo.search.result.Hit; +import com.yahoo.search.result.HitGroup; +import com.yahoo.search.result.StructuredData; +import com.yahoo.text.Utf8String; +import com.yahoo.text.XML; +import com.yahoo.text.XMLWriter; +import com.yahoo.yolean.trace.TraceNode; + +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.Executor; +import java.util.stream.Collectors; + +public class PageTemplatesXmlRenderer extends AsynchronousSectionedRenderer<Result> { + + public static final String DEFAULT_MIMETYPE = "text/xml"; + public static final String DEFAULT_ENCODING = "utf-8"; + + private static final Utf8String GROUP = new Utf8String("group"); + private static final Utf8String HIT = new Utf8String("hit"); + private static final Utf8String ERROR = new Utf8String("error"); + private static final Utf8String CODE = new Utf8String("code"); + private static final Utf8String COVERAGE_DOCS = new Utf8String("coverage-docs"); + private static final Utf8String COVERAGE_NODES = new Utf8String("coverage-nodes"); + private static final Utf8String COVERAGE_FULL = new Utf8String("coverage-full"); + private static final Utf8String COVERAGE = new Utf8String("coverage"); + private static final Utf8String RESULTS_FULL = new Utf8String("results-full"); + private static final Utf8String RESULTS = new Utf8String("results"); + private static final Utf8String TYPE = new Utf8String("type"); + private static final Utf8String RELEVANCE = new Utf8String("relevance"); + private static final Utf8String SOURCE = new Utf8String("source"); + + private XMLWriter writer; + + public PageTemplatesXmlRenderer() { + this(null); + } + + /** + * Creates a json renderer using a custom executor. + * Using a custom executor is useful for tests to avoid creating new threads for each renderer registry. + */ + public PageTemplatesXmlRenderer(Executor executor) { + super(executor); + } + + @Override + public void init() { + super.init(); + writer = null; + } + + @Override + public String getEncoding() { + if (getResult() == null + || getResult().getQuery() == null + || getResult().getQuery().getModel().getEncoding() == null) { + return DEFAULT_ENCODING; + } else { + return getResult().getQuery().getModel().getEncoding(); + } + } + + @Override + public String getMimeType() { + return DEFAULT_MIMETYPE; + } + + private XMLWriter wrapWriter(Writer writer) { + return XMLWriter.from(writer, 10, -1); + } + + private void header(XMLWriter writer, Result result) { + writer.xmlHeader(getRequestedEncoding(result.getQuery())); + writer.openTag("page").attribute("version", "1.0") + .attribute("layout", result.hits().getField("layout")); + renderCoverageAttributes(result.getCoverage(false), writer); + writer.closeStartTag(); + renderSectionContent(writer, result.hits()); + } + + private static void renderCoverageAttributes(Coverage coverage, XMLWriter writer) { + if (coverage == null) return; + writer.attribute(COVERAGE_DOCS,coverage.getDocs()); + writer.attribute(COVERAGE_NODES,coverage.getNodes()); + writer.attribute(COVERAGE_FULL,coverage.getFull()); + writer.attribute(COVERAGE,coverage.getResultPercentage()); + writer.attribute(RESULTS_FULL,coverage.getFullResultSets()); + writer.attribute(RESULTS,coverage.getResultSets()); + } + + public void error(XMLWriter writer, Result result) { + ErrorMessage error = result.hits().getError(); + writer.openTag(ERROR).attribute(CODE,error.getCode()).content(error.getMessage(),false).closeTag(); + } + + private void queryContext(XMLWriter writer, Query owner) { + if (owner.getTraceLevel()!=0) { + XMLWriter xmlWriter=XMLWriter.from(writer); + xmlWriter.openTag("meta").attribute("type", QueryContext.ID); + TraceNode traceRoot = owner.getModel().getExecution().trace().traceNode().root(); + traceRoot.accept(new com.yahoo.search.rendering.DefaultRenderer.RenderingVisitor(xmlWriter, owner.getStartTime())); + xmlWriter.closeTag(); + } + } + + private void renderSingularHit(XMLWriter writer, Hit hit) { + if ( ! hit.isMeta() && ! writer.isIn("content")) + writer.openTag("content"); + + writer.openTag(HIT); + renderHitAttributes(hit,writer); + writer.closeStartTag(); + renderField(writer, "id", hit.getId()); + hit.forEachField((name, value) -> renderField(writer, name, value)); + writer.closeTag(); + } + + /** Writes a hit's default attributes like 'type', 'source', 'relevance'. */ + private void renderHitAttributes(Hit hit, XMLWriter writer) { + writer.attribute(TYPE, hit.types().stream().collect(Collectors.joining(" "))); + if (hit.getRelevance() != null) + writer.attribute(RELEVANCE, hit.getRelevance().toString()); + writer.attribute(SOURCE, hit.getSource()); + } + + private void renderField(XMLWriter writer, String name, Object value) { + writer.openTag(name); + renderFieldContent(writer, value); + writer.closeTag(); + } + + private void renderFieldContent(XMLWriter writer, Object value) { + writer.escapedContent(asXML(value), false); + } + + private String asXML(Object value) { + if (value == null) + return "(null)"; + else if (value instanceof HitField) + return ((HitField)value).quotedContent(false); + else if (value instanceof StructuredData || value instanceof XMLString || value instanceof JSONString) + return value.toString(); + else + return XML.xmlEscape(value.toString(), false, '\u001f'); + } + + private void renderHitAttributes(XMLWriter writer, Hit hit) { + writer.attribute(TYPE, hit.types().stream().collect(Collectors.joining(" "))); + if (hit.getRelevance() != null) + writer.attribute(RELEVANCE, hit.getRelevance().toString()); + writer.attribute(SOURCE, hit.getSource()); + } + + private void renderHitGroup(XMLWriter writer, HitGroup hit) { + if (hit.types().contains("section")) { + + renderSection(writer, hit); // Renders /result/section + } + else if (hit.types().contains("meta")) { + writer.openTag("meta"); // renders /result/meta + writer.closeStartTag(); + } + else { + renderGroup(writer, hit); + } + } + + private void renderGroup(XMLWriter writer, HitGroup hit) { + writer.openTag(GROUP); + renderHitAttributes(writer, hit); + writer.closeStartTag(); + } + + private void renderSection(XMLWriter writer, HitGroup hit) { + writer.openTag("section"); + writer.attribute("id", hit.getDisplayId()); + writer.attribute("layout", hit.getField("layout")); + writer.attribute("region", hit.getField("region")); + writer.attribute("placement", hit.getField("placement")); // deprecated in 5.0 + writer.closeStartTag(); + renderSectionContent(writer, hit); + } + + private void renderSectionContent(XMLWriter writer, HitGroup hit) { + if (hit instanceof SectionHitGroup) { // render additional information + SectionHitGroup sectionGroup = (SectionHitGroup)hit; + for (Source source : sectionGroup.sources()) { + writer.openTag("source").attribute("url", source.getUrl()); + renderParameters(source.parameters(), writer); + writer.closeTag(); + } + for (Renderer renderer : sectionGroup.renderers()) { + writer.openTag("renderer").attribute("for", renderer.getRendererFor()).attribute("name", renderer.getName()); + renderParameters(renderer.parameters(), writer); + writer.closeTag(); + } + } + } + + private void renderParameters(Map<String,String> parameters, XMLWriter writer) { + // Render content + for (Map.Entry<String, String> parameter : parameters.entrySet()) + writer.openTag("parameter").attribute("name", parameter.getKey()) + .content(parameter.getValue(), false) + .closeTag(); + } + + private boolean simpleRenderHit(XMLWriter writer, Hit hit) { + if (hit instanceof DefaultErrorHit) { + return simpleRenderDefaultErrorHit(writer, (DefaultErrorHit) hit); + } else if (hit instanceof GroupingListHit) { + return true; + } else { + return false; + } + } + + public static boolean simpleRenderDefaultErrorHit(XMLWriter writer, ErrorHit defaultErrorHit) { + writer.openTag("errordetails"); + for (Iterator i = defaultErrorHit.errorIterator(); i.hasNext();) { + ErrorMessage error = (ErrorMessage) i.next(); + renderMessageDefaultErrorHit(writer, error); + } + writer.closeTag(); + return true; + } + + public static void renderMessageDefaultErrorHit(XMLWriter writer, ErrorMessage error) { + writer.openTag("error"); + writer.attribute("source", error.getSource()); + writer.attribute("error", error.getMessage()); + writer.attribute("code", Integer.toString(error.getCode())); + writer.content(error.getDetailedMessage(), false); + if (error.getCause()!=null) { + writer.openTag("cause"); + writer.content("\n", true); + StringWriter stackTrace=new StringWriter(); + error.getCause().printStackTrace(new PrintWriter(stackTrace)); + writer.content(stackTrace.toString(), true); + writer.closeTag(); + } + writer.closeTag(); + } + + private Result getResult() { + try { + return (Result) getResponse(); + } catch (ClassCastException e) { + throw new IllegalArgumentException("PageTemplatesXmlRenderer attempted used outside a search context, got a " + + getResponse().getClass().getName()); + } + } + + @Override + public void beginResponse(OutputStream stream) { + Charset cs = Charset.forName(getRequestedEncoding(getResult().getQuery())); + CharsetEncoder encoder = cs.newEncoder(); + writer = wrapWriter(new ByteWriter(stream, encoder)); + + header(writer, getResult()); + if (getResult().hits().getError() != null || getResult().hits().getQuery().errors().size() > 0) + error(writer, getResult()); + + if (getResult().getContext(false) != null) + queryContext(writer, getResult().getQuery()); + } + + /** Returns the encoding of the query, or the encoding given by the template if none is set */ + public final String getRequestedEncoding(Query query) { + String encoding = query.getModel().getEncoding(); + if (encoding != null) return encoding; + return getEncoding(); + } + + @Override + public void beginList(DataList<?> list) { + if (getRecursionLevel() == 1) return; + + HitGroup hit = (HitGroup) list; + boolean renderedSimple = simpleRenderHit(writer, hit); + if (renderedSimple) return; + + renderHitGroup(writer, hit); + } + + @Override + public void data(Data data) { + Hit hit = (Hit) data; + boolean renderedSimple = simpleRenderHit(writer, hit); + if ( ! renderedSimple) + renderSingularHit(writer, hit); + } + + @Override + public void endList(DataList<?> list) { + if (writer.isIn("content")) + writer.closeTag(); + if (getRecursionLevel() > 1) + writer.closeTag(); + } + + @Override + public void endResponse() { + writer.closeTag(); + writer.close(); + } + +}
\ No newline at end of file diff --git a/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java index a5a0cbdd57c..3562a1a9572 100644 --- a/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java +++ b/container-search/src/main/java/com/yahoo/search/rendering/DefaultRenderer.java @@ -80,7 +80,7 @@ public final class DefaultRenderer extends AsynchronousSectionedRenderer<Result> } /** - * Creates a json renderer using a custom executor. + * Creates an XML renderer using a custom executor. * Using a custom executor is useful for tests to avoid creating new threads for each renderer registry. */ public DefaultRenderer(Executor executor) { diff --git a/container-search/src/main/java/com/yahoo/search/result/Templating.java b/container-search/src/main/java/com/yahoo/search/result/Templating.java index beb132f820e..6f1414c368b 100644 --- a/container-search/src/main/java/com/yahoo/search/result/Templating.java +++ b/container-search/src/main/java/com/yahoo/search/result/Templating.java @@ -191,7 +191,6 @@ public class Templating { /** * @deprecated since 5.1.21, use {@link Presentation#getRenderer()} */ - @Deprecated // OK Do not remove on Vespa 6. Remove when we move everything having to do with templates public Renderer<Result> getRenderer() { return renderer; } @@ -199,7 +198,6 @@ public class Templating { /** * @deprecated since 5.1.21, use {@link Presentation#setRenderer(com.yahoo.component.ComponentSpecification)} */ - @Deprecated // OK Do not remove on Vespa 6. Remove when we move everything having to do with templates public void setRenderer(Renderer<Result> renderer) { this.renderer = renderer; } diff --git a/container-search/src/test/java/com/yahoo/prelude/searcher/test/ErrorHitRenderTestCase.java b/container-search/src/test/java/com/yahoo/prelude/searcher/test/ErrorHitRenderTestCase.java deleted file mode 100644 index 7c170cc59b3..00000000000 --- a/container-search/src/test/java/com/yahoo/prelude/searcher/test/ErrorHitRenderTestCase.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.prelude.searcher.test; - -import com.yahoo.prelude.templates.SearchRendererAdaptor; -import com.yahoo.search.result.DefaultErrorHit; -import com.yahoo.search.result.ErrorHit; -import com.yahoo.search.result.ErrorMessage; -import com.yahoo.text.XMLWriter; -import org.junit.Test; - -import java.io.StringWriter; - -import static org.junit.Assert.assertEquals; - -/** - * Tests marking hit properties as XML - * - * @author Steinar Knutsen - */ -public class ErrorHitRenderTestCase { - - @Test - public void testXMLEscaping() throws java.io.IOException { - ErrorHit h = new DefaultErrorHit("testcase", ErrorMessage.createUnspecifiedError("<>\"&")); - - StringWriter writer = new StringWriter(); - SearchRendererAdaptor.renderMessageDefaultErrorHit(new XMLWriter(writer), h.errors().iterator().next()); - assertEquals("<error source=\"testcase\" error=\"Unspecified error\" code=\"5\"><>\"&</error>\n", - writer.toString()); - } - -} diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/AnySourceResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/AnySourceResult.xml index a1713a987cd..f1b2c823681 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/AnySourceResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/AnySourceResult.xml @@ -1,41 +1,33 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0"> - - <hit relevance="1.0" source="source3"> - <id>source3-1</id> - </hit> - - <hit relevance="1.0" source="source1"> - <id>source1-1</id> - </hit> - - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - - <hit relevance="0.5" source="source3"> - <id>source3-2</id> - </hit> - - <hit relevance="0.5" source="source1"> - <id>source1-2</id> - </hit> - - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - - <hit relevance="0.3333333333333333" source="source3"> - <id>source3-3</id> - </hit> - - <hit relevance="0.3333333333333333" source="source1"> - <id>source1-3</id> - </hit> - - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> - -</result> +<page version="1.0"> + <content> + <hit relevance="1.0" source="source3"> + <id>source3-1</id> + </hit> + <hit relevance="1.0" source="source1"> + <id>source1-1</id> + </hit> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source3"> + <id>source3-2</id> + </hit> + <hit relevance="0.5" source="source1"> + <id>source1-2</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source3"> + <id>source3-3</id> + </hit> + <hit relevance="0.3333333333333333" source="source1"> + <id>source1-3</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + </content> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfRenderersResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfRenderersResult.xml index e1ae0b928e6..fc8b2cdc847 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfRenderersResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfRenderersResult.xml @@ -1,36 +1,29 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0"> - +<page version="1.0"> <renderer name="sectionLook2"/> - <renderer for="source1" name="source1Look3"> <parameter name="color">#ff00ff</parameter> <parameter name="blink">true</parameter> </renderer> - - <hit relevance="1.0" source="source1"> - <id>source1-1</id> - </hit> - - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - - <hit relevance="0.5" source="source1"> - <id>source1-2</id> - </hit> - - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - - <hit relevance="0.3333333333333333" source="source1"> - <id>source1-3</id> - </hit> - - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> - -</result> + <content> + <hit relevance="1.0" source="source1"> + <id>source1-1</id> + </hit> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source1"> + <id>source1-2</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source1"> + <id>source1-3</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + </content> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsResult.xml index a2cf4b8a773..01af611c51a 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsResult.xml @@ -1,29 +1,30 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0"> - +<page version="1.0"> <section> - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> + <content> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + </content> </section> - <section> - <hit relevance="1.0" source="source4"> - <id>source4-1</id> - </hit> - <hit relevance="0.5" source="source4"> - <id>source4-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source4"> - <id>source4-3</id> - </hit> + <content> + <hit relevance="1.0" source="source4"> + <id>source4-1</id> + </hit> + <hit relevance="0.5" source="source4"> + <id>source4-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source4"> + <id>source4-3</id> + </hit> + </content> </section> - -</result> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsTestCase.java b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsTestCase.java index 513d861c86c..8c9e1767989 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfSubsectionsTestCase.java @@ -10,6 +10,9 @@ import com.yahoo.search.pagetemplates.model.Choice; import com.yahoo.search.result.HitGroup; import org.junit.Test; +import java.util.Collections; +import java.util.stream.Collectors; + import static org.junit.Assert.assertEquals; /** @@ -20,47 +23,49 @@ public class ChoiceOfSubsectionsTestCase extends ExecutionAbstractTestCase { @Test public void testExecution() { // Create the page template - Choice page=Choice.createSingleton(importPage("ChoiceOfSubsections.xml")); + Choice page = Choice.createSingleton(importPage("ChoiceOfSubsections.xml")); // Create a federated result - Query query=new Query(); - Result result=new Result(query); - result.hits().add(createHits("source1",3)); - result.hits().add(createHits("source2",3)); - result.hits().add(createHits("source3",3)); - result.hits().add(createHits("source4",3)); + Query query = new Query(); + Result result = new Result(query); + result.hits().add(createHits("source1", 3)); + result.hits().add(createHits("source2", 3)); + result.hits().add(createHits("source3", 3)); + result.hits().add(createHits("source4", 3)); - new Organizer().organize(page,new DeterministicResolverAssertingMethod().resolve(page,query,result),result); + new Organizer().organize(page, new DeterministicResolverAssertingMethod().resolve(page, query, result), result); // Check execution: // Two subsections with one source each - assertEquals(2,result.hits().size()); - HitGroup section1=(HitGroup)result.hits().get(0); - HitGroup section2=(HitGroup)result.hits().get(1); - assertEqualHitGroups(createHits("source2",3),section1); - assertEqualHitGroups(createHits("source4",3),section2); + assertEquals(2, result.hits().size()); + HitGroup section1 = (HitGroup)result.hits().get(0); + HitGroup section2 = (HitGroup)result.hits().get(1); + assertEquals("section", section1.types().stream().collect(Collectors.joining(", "))); + assertEquals("section", section2.types().stream().collect(Collectors.joining(", "))); + assertEqualHitGroups(createHits("source2", 3), section1); + assertEqualHitGroups(createHits("source4", 3), section2); // Check rendering - assertRendered(result,"ChoiceOfSubsectionsResult.xml"); + assertRendered(result, "ChoiceOfSubsectionsResult.xml"); } /** Same as deterministic resolver, but asserts that it received the correct method names for each choice */ private static class DeterministicResolverAssertingMethod extends DeterministicResolver { - private int invocationNumber=0; + private int invocationNumber = 0; /** Chooses the last alternative of any choice */ @Override public void resolve(Choice choice, Query query, Result result, Resolution resolution) { invocationNumber++; - if (invocationNumber==2) - assertEquals("method1",choice.getMethod()); - else if (invocationNumber==3) - assertEquals("method2",choice.getMethod()); - else if (invocationNumber>3) + if (invocationNumber == 2) + assertEquals("method1", choice.getMethod()); + else if (invocationNumber == 3) + assertEquals("method2", choice.getMethod()); + else if (invocationNumber > 3) throw new IllegalStateException("Unexpected number of resolver invocations"); - super.resolve(choice,query,result,resolution); + super.resolve(choice, query, result, resolution); } } diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfTwoSourcesResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfTwoSourcesResult.xml index 149aa297bd3..c02f7469afd 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfTwoSourcesResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoiceOfTwoSourcesResult.xml @@ -1,17 +1,15 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0"> - - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> - -</result> +<page version="1.0"> + <content> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + </content> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoicesResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoicesResult.xml index 60f5c9a9cb1..f135f6e1f52 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoicesResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ChoicesResult.xml @@ -1,55 +1,60 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0"> - +<page version="1.0"> <section layout="row"> <section id="section:box1"> - <hit relevance="1.0" source="news"> - <id>news-1</id> - </hit> - <hit relevance="0.5" source="news"> - <id>news-2</id> - </hit> - <hit relevance="0.3333333333333333" source="news"> - <id>news-3</id> - </hit> + <content> + <hit relevance="1.0" source="news"> + <id>news-1</id> + </hit> + <hit relevance="0.5" source="news"> + <id>news-2</id> + </hit> + <hit relevance="0.3333333333333333" source="news"> + <id>news-3</id> + </hit> + </content> </section> <section id="section:box2"> - <hit relevance="1.0" source="web"> - <id>web-1</id> - </hit> - <hit relevance="0.5" source="web"> - <id>web-2</id> - </hit> - <hit relevance="0.3333333333333333" source="web"> - <id>web-3</id> - </hit> + <content> + <hit relevance="1.0" source="web"> + <id>web-1</id> + </hit> + <hit relevance="0.5" source="web"> + <id>web-2</id> + </hit> + <hit relevance="0.3333333333333333" source="web"> + <id>web-3</id> + </hit> + </content> </section> </section> - <section layout="row"> <section id="section:box3"> - <hit relevance="1.0" source="blog"> - <id>blog-1</id> - </hit> - <hit relevance="0.5" source="blog"> - <id>blog-2</id> - </hit> - <hit relevance="0.3333333333333333" source="blog"> - <id>blog-3</id> - </hit> + <content> + <hit relevance="1.0" source="blog"> + <id>blog-1</id> + </hit> + <hit relevance="0.5" source="blog"> + <id>blog-2</id> + </hit> + <hit relevance="0.3333333333333333" source="blog"> + <id>blog-3</id> + </hit> + </content> </section> <section id="section:box4"> - <hit relevance="1.0" source="images"> - <id>images-1</id> - </hit> - <hit relevance="0.5" source="images"> - <id>images-2</id> - </hit> - <hit relevance="0.3333333333333333" source="images"> - <id>images-3</id> - </hit> + <content> + <hit relevance="1.0" source="images"> + <id>images-1</id> + </hit> + <hit relevance="0.5" source="images"> + <id>images-2</id> + </hit> + <hit relevance="0.3333333333333333" source="images"> + <id>images-3</id> + </hit> + </content> </section> </section> - -</result> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ExecutionAbstractTestCase.java b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ExecutionAbstractTestCase.java index 8bb3e9cd2db..999a6d32ac6 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ExecutionAbstractTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/ExecutionAbstractTestCase.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.pagetemplates.engine.test; +import com.google.common.util.concurrent.ListenableFuture; import com.yahoo.io.IOUtils; import com.yahoo.prelude.templates.TiledTemplateSet; import com.yahoo.prelude.templates.UserTemplate; @@ -8,10 +9,13 @@ import com.yahoo.prelude.templates.test.TilingTestCase; import com.yahoo.search.Result; import com.yahoo.search.pagetemplates.PageTemplate; import com.yahoo.search.pagetemplates.config.PageTemplateXMLReader; +import com.yahoo.search.pagetemplates.result.PageTemplatesXmlRenderer; import com.yahoo.search.result.Hit; import com.yahoo.search.result.HitGroup; +import com.yahoo.text.Utf8; import java.io.*; +import java.util.List; import static org.junit.Assert.*; @@ -52,23 +56,32 @@ public class ExecutionAbstractTestCase { assertRendered(result,resultFileName,false); } - protected void assertRendered(Result result, String resultFileName, UserTemplate<?> template) { - assertRendered(result, resultFileName, template,false); - } - - protected void assertRendered(Result result,String resultFileName,boolean print) { - assertRendered(result,resultFileName,new TiledTemplateSet(),print); - } - @SuppressWarnings("deprecation") - protected void assertRendered(Result result,String resultFileName,UserTemplate<?> template, boolean print) { - result.getTemplating().setTemplates(template); + protected void assertRendered(Result result, String resultFileName, boolean print) { try { - TilingTestCase.assertRendered(IOUtils.readFile(new File(root + resultFileName)), result); + PageTemplatesXmlRenderer renderer = new PageTemplatesXmlRenderer(); + renderer.init(); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + ListenableFuture<Boolean> f = renderer.render(stream, result, null, null); + assertTrue(f.get()); + String renderedResult = Utf8.toString(stream.toByteArray()); + if (print) + System.out.println(renderedResult); + assertEquals(removeComments(IOUtils.getLines(root + resultFileName)), + renderedResult); } - catch (IOException e) { + catch (Exception e) { throw new RuntimeException(e); } } + private String removeComments(List<String> xmlLines) { + StringBuilder b = new StringBuilder(); + for (String line : xmlLines) { + if (line.trim().startsWith("<!--")) continue; + b.append(line).append('\n'); + } + return b.toString(); + } + } diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSectionsToSectionsResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSectionsToSectionsResult.xml index 4272e54aeec..5fceca589e4 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSectionsToSectionsResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSectionsToSectionsResult.xml @@ -1,96 +1,103 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0" layout="column"> - +<page version="1.0" layout="column"> <section layout="row"> <section id="section:box1"> - <hit relevance="1.0" source="source1"> - <id>source1-1</id> - </hit> - <hit relevance="0.5" source="source1"> - <id>source1-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source1"> - <id>source1-3</id> - </hit> + <content> + <hit relevance="1.0" source="source1"> + <id>source1-1</id> + </hit> + <hit relevance="0.5" source="source1"> + <id>source1-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source1"> + <id>source1-3</id> + </hit> + </content> </section> <section id="section:box2"> - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> - <hit relevance="0.25" source="source2"> - <id>source2-4</id> - </hit> + <content> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + <hit relevance="0.25" source="source2"> + <id>source2-4</id> + </hit> + </content> </section> </section> - <section layout="row"> <section id="section:box3"> - <hit relevance="1.0" source="source3"> - <id>source3-1</id> - </hit> - <hit relevance="0.5" source="source3"> - <id>source3-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source3"> - <id>source3-3</id> - </hit> - <hit relevance="0.25" source="source3"> - <id>source3-4</id> - </hit> - <hit relevance="0.2" source="source3"> - <id>source3-5</id> - </hit> + <content> + <hit relevance="1.0" source="source3"> + <id>source3-1</id> + </hit> + <hit relevance="0.5" source="source3"> + <id>source3-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source3"> + <id>source3-3</id> + </hit> + <hit relevance="0.25" source="source3"> + <id>source3-4</id> + </hit> + <hit relevance="0.2" source="source3"> + <id>source3-5</id> + </hit> + </content> </section> <section id="section:box5"> - <hit relevance="1.0" source="source5"> - <id>source5-1</id> - </hit> - <hit relevance="0.5" source="source5"> - <id>source5-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source5"> - <id>source5-3</id> - </hit> - <hit relevance="0.25" source="source5"> - <id>source5-4</id> - </hit> - <hit relevance="0.2" source="source5"> - <id>source5-5</id> - </hit> - <hit relevance="0.16666666666666666" source="source5"> - <id>source5-6</id> - </hit> - <hit relevance="0.14285714285714285" source="source5"> - <id>source5-7</id> - </hit> + <content> + <hit relevance="1.0" source="source5"> + <id>source5-1</id> + </hit> + <hit relevance="0.5" source="source5"> + <id>source5-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source5"> + <id>source5-3</id> + </hit> + <hit relevance="0.25" source="source5"> + <id>source5-4</id> + </hit> + <hit relevance="0.2" source="source5"> + <id>source5-5</id> + </hit> + <hit relevance="0.16666666666666666" source="source5"> + <id>source5-6</id> + </hit> + <hit relevance="0.14285714285714285" source="source5"> + <id>source5-7</id> + </hit> + </content> </section> <section id="section:box4"> - <hit relevance="1.0" source="source4"> - <id>source4-1</id> - </hit> - <hit relevance="0.5" source="source4"> - <id>source4-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source4"> - <id>source4-3</id> - </hit> - <hit relevance="0.25" source="source4"> - <id>source4-4</id> - </hit> - <hit relevance="0.2" source="source4"> - <id>source4-5</id> - </hit> - <hit relevance="0.16666666666666666" source="source4"> - <id>source4-6</id> - </hit> + <content> + <hit relevance="1.0" source="source4"> + <id>source4-1</id> + </hit> + <hit relevance="0.5" source="source4"> + <id>source4-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source4"> + <id>source4-3</id> + </hit> + <hit relevance="0.25" source="source4"> + <id>source4-4</id> + </hit> + <hit relevance="0.2" source="source4"> + <id>source4-5</id> + </hit> + <hit relevance="0.16666666666666666" source="source4"> + <id>source4-6</id> + </hit> + </content> </section> </section> - -</result> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSourcesToSectionsResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSourcesToSectionsResult.xml index 623918c8739..0c29127da26 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSourcesToSectionsResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/MapSourcesToSectionsResult.xml @@ -1,73 +1,78 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0" layout="column"> - +<page version="1.0" layout="column"> <section layout="row"> <section id="section:box1"> - <hit relevance="1.0" source="source1"> - <id>source1-1</id> - </hit> - <hit relevance="0.5" source="source1"> - <id>source1-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source1"> - <id>source1-3</id> - </hit> + <content> + <hit relevance="1.0" source="source1"> + <id>source1-1</id> + </hit> + <hit relevance="0.5" source="source1"> + <id>source1-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source1"> + <id>source1-3</id> + </hit> + </content> </section> <section id="section:box2"> - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> - <hit relevance="0.25" source="source2"> - <id>source2-4</id> - </hit> + <content> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + <hit relevance="0.25" source="source2"> + <id>source2-4</id> + </hit> + </content> </section> </section> - <section layout="row"> <section id="section:box3"> - <hit relevance="1.0" source="source3"> - <id>source3-1</id> - </hit> - <hit relevance="0.5" source="source3"> - <id>source3-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source3"> - <id>source3-3</id> - </hit> - <hit relevance="0.25" source="source3"> - <id>source3-4</id> - </hit> - <hit relevance="0.2" source="source3"> - <id>source3-5</id> - </hit> + <content> + <hit relevance="1.0" source="source3"> + <id>source3-1</id> + </hit> + <hit relevance="0.5" source="source3"> + <id>source3-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source3"> + <id>source3-3</id> + </hit> + <hit relevance="0.25" source="source3"> + <id>source3-4</id> + </hit> + <hit relevance="0.2" source="source3"> + <id>source3-5</id> + </hit> + </content> </section> <section id="section:box4"> - <hit relevance="1.0" source="source4"> - <id>source4-1</id> - </hit> - <hit relevance="0.5" source="source4"> - <id>source4-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source4"> - <id>source4-3</id> - </hit> - <hit relevance="0.25" source="source4"> - <id>source4-4</id> - </hit> - <hit relevance="0.2" source="source4"> - <id>source4-5</id> - </hit> - <hit relevance="0.16666666666666666" source="source4"> - <id>source4-6</id> - </hit> + <content> + <hit relevance="1.0" source="source4"> + <id>source4-1</id> + </hit> + <hit relevance="0.5" source="source4"> + <id>source4-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source4"> + <id>source4-3</id> + </hit> + <hit relevance="0.25" source="source4"> + <id>source4-4</id> + </hit> + <hit relevance="0.2" source="source4"> + <id>source4-5</id> + </hit> + <hit relevance="0.16666666666666666" source="source4"> + <id>source4-6</id> + </hit> + </content> </section> </section> - -</result> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageResult.xml index 1ac4368d3ec..29c6f47765c 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageResult.xml @@ -1,16 +1,13 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <page version="1.0"> - <renderer name="two-column"/> - <section region="left"> <source url="http://carmot.yahoo.com:4080/resource/[news article id]"/> <renderer name="articleBodyRenderer"> <parameter name="color">blue</parameter> </renderer> </section> - <section region="right"> <renderer name="multi-item-column"> <parameter name="items">3</parameter> @@ -39,5 +36,4 @@ </content> </section> </section> - </page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageTestCase.java b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageTestCase.java index d2f109aad76..1935ad95c40 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageTestCase.java @@ -1,7 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.pagetemplates.engine.test; -import com.yahoo.prelude.templates.PageTemplateSet; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.pagetemplates.engine.Organizer; @@ -38,7 +37,7 @@ public class PageTestCase extends ExecutionAbstractTestCase { organizer.organize(page, resolution, result); // Check rendering - assertRendered(result, "PageResult.xml", new PageTemplateSet()); + assertRendered(result, "PageResult.xml"); } } diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingResult.xml index 01f74ad67a2..e7e7a37715c 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingResult.xml @@ -1,16 +1,13 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <page version="1.0"> - <renderer name="two-column"/> - <section region="left"> <source url="http://carmot.yahoo.com:4080/resource/[news article id]"/> <renderer name="articleBodyRenderer"> <parameter name="color">blue</parameter> </renderer> </section> - <section region="right"> <renderer name="multi-item-column"> <parameter name="items">3</parameter> @@ -41,5 +38,4 @@ </content> </section> </section> - </page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingTestCase.java b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingTestCase.java index 0e8088d8b2a..5c8d756a72d 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithBlendingTestCase.java @@ -1,7 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.pagetemplates.engine.test; -import com.yahoo.prelude.templates.PageTemplateSet; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.pagetemplates.engine.Organizer; @@ -12,7 +11,7 @@ import com.yahoo.search.pagetemplates.model.Choice; import org.junit.Test; /** - * Tests an exapnded example. + * Tests an expanded example. * * @author bratseth */ @@ -21,24 +20,24 @@ public class PageWithBlendingTestCase extends ExecutionAbstractTestCase { @Test public void testExecution() { // Create the page template - Choice page=Choice.createSingleton(importPage("PageWithBlending.xml")); + Choice page = Choice.createSingleton(importPage("PageWithBlending.xml")); // Create a federated result - Query query=new Query(); - Result result=new Result(query); - result.hits().add(createHits("news",2)); - result.hits().add(createHits("htmlSource",1)); + Query query = new Query(); + Result result = new Result(query); + result.hits().add(createHits("news", 2)); + result.hits().add(createHits("htmlSource", 1)); // Resolve (noop here) - Resolver resolver=new DeterministicResolver(); - Resolution resolution=resolver.resolve(page,query,result); + Resolver resolver = new DeterministicResolver(); + Resolution resolution = resolver.resolve(page, query, result); // Execute - Organizer organizer =new Organizer(); - organizer.organize(page,resolution,result); + Organizer organizer = new Organizer(); + organizer.organize(page, resolution, result); // Check rendering - assertRendered(result,"PageWithBlendingResult.xml",new PageTemplateSet()); + assertRendered(result, "PageWithBlendingResult.xml"); } } diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererResult.xml index 95f01a6d7c8..9dd3610c136 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererResult.xml @@ -1,16 +1,13 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <page version="1.0"> - <renderer name="two-column"/> - <section region="left"> <source url="http://carmot.yahoo.com:4080/resource/[news article id]"/> <renderer name="articleBodyRenderer"> <parameter name="color">blue</parameter> </renderer> </section> - <section region="right"> <renderer name="multi-item-column"> <parameter name="items">3</parameter> @@ -39,5 +36,4 @@ </content> </section> </section> - </page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererTestCase.java b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererTestCase.java index 4a9ad9745cf..35cc129ba93 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/PageWithSourceRendererTestCase.java @@ -1,7 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.pagetemplates.engine.test; -import com.yahoo.prelude.templates.PageTemplateSet; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.pagetemplates.engine.Organizer; @@ -21,24 +20,24 @@ public class PageWithSourceRendererTestCase extends ExecutionAbstractTestCase { @Test public void testExecution() { // Create the page template - Choice page=Choice.createSingleton(importPage("PageWithSourceRenderer.xml")); + Choice page = Choice.createSingleton(importPage("PageWithSourceRenderer.xml")); // Create a federated result - Query query=new Query(); - Result result=new Result(query); - result.hits().add(createHits("news",2)); - result.hits().add(createHits("htmlSource",1)); + Query query = new Query(); + Result result = new Result(query); + result.hits().add(createHits("news", 2)); + result.hits().add(createHits("htmlSource", 1)); // Resolve - Resolver resolver=new DeterministicResolver(); - Resolution resolution=resolver.resolve(page,query,result); + Resolver resolver = new DeterministicResolver(); + Resolution resolution = resolver.resolve(page, query, result); // Execute - Organizer organizer =new Organizer(); - organizer.organize(page,resolution,result); + Organizer organizer = new Organizer(); + organizer.organize(page, resolution, result); // Check rendering - assertRendered(result,"PageWithSourceRendererResult.xml",new PageTemplateSet()); + assertRendered(result, "PageWithSourceRendererResult.xml"); } } diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceResult.xml index dfdbac4b7ce..2c7bdff75fb 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceResult.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> <page version="1.0"> - <content> <hit relevance="1.0" source="web"> <id>web-1</id> @@ -13,5 +12,4 @@ <id>web-3</id> </hit> </content> - </page> diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceTestCase.java b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceTestCase.java index 5c6cbbb4e27..93b6a958657 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/SourceChoiceTestCase.java @@ -1,7 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.pagetemplates.engine.test; -import com.yahoo.prelude.templates.PageTemplateSet; import com.yahoo.search.Query; import com.yahoo.search.Result; import com.yahoo.search.pagetemplates.engine.Organizer; @@ -19,25 +18,25 @@ public class SourceChoiceTestCase extends ExecutionAbstractTestCase { @Test public void testExecution() { // Create the page template - Choice page=Choice.createSingleton(importPage("SourceChoice.xml")); + Choice page = Choice.createSingleton(importPage("SourceChoice.xml")); // Create a federated result - Query query=new Query(); - Result result=new Result(query); - result.hits().add(createHits("web",3)); - result.hits().add(createHits("news",3)); - result.hits().add(createHits("blog",3)); + Query query = new Query(); + Result result = new Result(query); + result.hits().add(createHits("web", 3)); + result.hits().add(createHits("news", 3)); + result.hits().add(createHits("blog", 3)); // Resolve (noop here) - Resolver resolver=new DeterministicResolver(); - Resolution resolution=resolver.resolve(page,query,result); + Resolver resolver = new DeterministicResolver(); + Resolution resolution = resolver.resolve(page,query,result); // Execute - Organizer organizer =new Organizer(); - organizer.organize(page,resolution,result); + Organizer organizer = new Organizer(); + organizer.organize(page, resolution, result); // Check rendering - assertRendered(result,"SourceChoiceResult.xml",new PageTemplateSet(),true); + assertRendered(result,"SourceChoiceResult.xml", false); } } diff --git a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/TwoSectionsFourSourcesResult.xml b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/TwoSectionsFourSourcesResult.xml index 73b62afd6c1..0b0fe91e7b4 100644 --- a/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/TwoSectionsFourSourcesResult.xml +++ b/container-search/src/test/java/com/yahoo/search/pagetemplates/engine/test/TwoSectionsFourSourcesResult.xml @@ -1,65 +1,66 @@ <?xml version="1.0" encoding="utf-8" ?> <!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> -<result version="1.0" layout="twoColumns"> - +<page version="1.0" layout="twoColumns"> <section region="left"> - <hit relevance="1.0" source="source3"> - <id>source3-1</id> - </hit> - <hit relevance="0.5" source="source3"> - <id>source3-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source3"> - <id>source3-3</id> - </hit> - <hit relevance="0.25" source="source3"> - <id>source3-4</id> - </hit> - <hit relevance="0.2" source="source3"> - <id>source3-5</id> - </hit> - <hit relevance="1.0" source="source1"> - <id>source1-1</id> - </hit> - <hit relevance="0.5" source="source1"> - <id>source1-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source1"> - <id>source1-3</id> - </hit> + <content> + <hit relevance="1.0" source="source3"> + <id>source3-1</id> + </hit> + <hit relevance="0.5" source="source3"> + <id>source3-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source3"> + <id>source3-3</id> + </hit> + <hit relevance="0.25" source="source3"> + <id>source3-4</id> + </hit> + <hit relevance="0.2" source="source3"> + <id>source3-5</id> + </hit> + <hit relevance="1.0" source="source1"> + <id>source1-1</id> + </hit> + <hit relevance="0.5" source="source1"> + <id>source1-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source1"> + <id>source1-3</id> + </hit> + </content> </section> - <section region="right"> - <hit relevance="1.0" source="source4"> - <id>source4-1</id> - </hit> - <hit relevance="1.0" source="source2"> - <id>source2-1</id> - </hit> - <hit relevance="0.5" source="source4"> - <id>source4-2</id> - </hit> - <hit relevance="0.5" source="source2"> - <id>source2-2</id> - </hit> - <hit relevance="0.3333333333333333" source="source4"> - <id>source4-3</id> - </hit> - <hit relevance="0.3333333333333333" source="source2"> - <id>source2-3</id> - </hit> - <hit relevance="0.25" source="source4"> - <id>source4-4</id> - </hit> - <hit relevance="0.25" source="source2"> - <id>source2-4</id> - </hit> - <hit relevance="0.2" source="source4"> - <id>source4-5</id> - </hit> - <hit relevance="0.16666666666666666" source="source4"> - <id>source4-6</id> - </hit> + <content> + <hit relevance="1.0" source="source4"> + <id>source4-1</id> + </hit> + <hit relevance="1.0" source="source2"> + <id>source2-1</id> + </hit> + <hit relevance="0.5" source="source4"> + <id>source4-2</id> + </hit> + <hit relevance="0.5" source="source2"> + <id>source2-2</id> + </hit> + <hit relevance="0.3333333333333333" source="source4"> + <id>source4-3</id> + </hit> + <hit relevance="0.3333333333333333" source="source2"> + <id>source2-3</id> + </hit> + <hit relevance="0.25" source="source4"> + <id>source4-4</id> + </hit> + <hit relevance="0.25" source="source2"> + <id>source2-4</id> + </hit> + <hit relevance="0.2" source="source4"> + <id>source4-5</id> + </hit> + <hit relevance="0.16666666666666666" source="source4"> + <id>source4-6</id> + </hit> + </content> </section> - -</result> +</page> diff --git a/container-search/src/test/java/com/yahoo/search/rendering/XMLRendererTestCase.java b/container-search/src/test/java/com/yahoo/search/rendering/XMLRendererTestCase.java index a52d9bcdb6c..41b2a235daa 100644 --- a/container-search/src/test/java/com/yahoo/search/rendering/XMLRendererTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/rendering/XMLRendererTestCase.java @@ -31,7 +31,7 @@ import com.yahoo.text.Utf8; /** * Test the XML renderer * - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @author Steinar Knutsen */ public class XMLRendererTestCase { diff --git a/container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java b/container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java deleted file mode 100644 index 14e127ec72c..00000000000 --- a/container-search/src/test/java/com/yahoo/search/result/test/DefaultErrorHitTestCase.java +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.search.result.test; - -import com.yahoo.prelude.templates.SearchRendererAdaptor; -import com.yahoo.search.result.DefaultErrorHit; -import com.yahoo.search.result.ErrorMessage; -import org.junit.Test; - -import java.io.IOException; -import java.io.StringWriter; - -import static org.junit.Assert.assertEquals; - -/** - * @author bratseth - */ -public class DefaultErrorHitTestCase { - - @Test - public void testErrorHitRenderingWithException() throws IOException { - NullPointerException cause=null; - try { - Object a=null; - a.toString(); - } - catch (NullPointerException e) { - cause=e; - } - StringWriter w=new StringWriter(); - SearchRendererAdaptor.simpleRenderDefaultErrorHit(w, new DefaultErrorHit("test", new ErrorMessage(79, "Myerror", "Mydetail", cause))); - String sep = System.getProperty("line.separator"); - assertEquals( - "<errordetails>\n" + - " <error source=\"test\" error=\"Myerror\" code=\"79\">Mydetail\n" + - " <cause>\n" + - "java.lang.NullPointerException" + sep + - "\tat " - ,w.toString().substring(0, 119+sep.length())); - } - -} |