summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/pagetemplates/engine/resolvers/RandomResolver.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/pagetemplates/engine/resolvers/RandomResolver.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/pagetemplates/engine/resolvers/RandomResolver.java50
1 files changed, 50 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/pagetemplates/engine/resolvers/RandomResolver.java b/container-search/src/main/java/com/yahoo/search/pagetemplates/engine/resolvers/RandomResolver.java
new file mode 100644
index 00000000000..5f06c66795d
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/pagetemplates/engine/resolvers/RandomResolver.java
@@ -0,0 +1,50 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.pagetemplates.engine.resolvers;
+
+import com.yahoo.search.Query;
+import com.yahoo.search.Result;
+import com.yahoo.search.pagetemplates.engine.Resolution;
+import com.yahoo.search.pagetemplates.engine.Resolver;
+import com.yahoo.search.pagetemplates.model.Choice;
+import com.yahoo.search.pagetemplates.model.MapChoice;
+import com.yahoo.search.pagetemplates.model.PageElement;
+
+import java.util.*;
+
+/**
+ * A resolver which makes all choices by random.
+ * The id of this is <code>native.random</code>.
+ *
+ * @author <a href="mailto:bratseth@yahoo-inc.com">Jon Bratseth</a>
+ */
+public class RandomResolver extends Resolver {
+
+ public static final String nativeId = "native.random";
+
+ private Random random = new Random(System.currentTimeMillis()); // Use of this is multithread safe
+
+ public RandomResolver() {}
+
+ protected RandomResolver(String id) {
+ super(id);
+ }
+
+ /** Chooses the last alternative of any choice */
+ @Override
+ public void resolve(Choice choice, Query query, Result result, Resolution resolution) {
+ resolution.addChoiceResolution(choice,random.nextInt(choice.alternatives().size()));
+ }
+
+ /** Chooses a mapping which is always by the literal order given in the source template */
+ @Override
+ public void resolve(MapChoice choice,Query query,Result result,Resolution resolution) {
+ Map<String, List<PageElement>> mapping=new HashMap<>();
+ // Draw a random element from the value list on each iteration and assign it to a placeholder
+ List<String> placeholderIds=choice.placeholderIds();
+ List<List<PageElement>> valueList=new ArrayList<>(choice.values());
+ for (String placeholderId : placeholderIds)
+ mapping.put(placeholderId,valueList.remove(random.nextInt(valueList.size())));
+ resolution.addMapChoiceResolution(choice,mapping);
+ }
+
+}