package org.rakam.recipe; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.rakam.collection.FieldType; import org.rakam.collection.SchemaField; import org.rakam.plugin.ContinuousQuery; import org.rakam.plugin.MaterializedView; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Recipe { private final Strategy strategy; private final Map<String, CollectionDefinition> collections; private final List<MaterializedView> materializedViews; private final List<ContinuousQuery> continuousQueries; @JsonCreator public Recipe(@JsonProperty("strategy") Strategy strategy, @JsonProperty("collections") Map<String, CollectionDefinition> collections, @JsonProperty("materialized_views") List<MaterializedView> materializedQueries, @JsonProperty("continuous_queries") List<ContinuousQuery> continuousQueries) { this.strategy = strategy; this.collections = collections != null ? ImmutableMap.copyOf(collections) : ImmutableMap.of(); this.materializedViews = materializedQueries == null ? ImmutableList.of() : ImmutableList.copyOf(materializedQueries); this.continuousQueries = continuousQueries == null ? ImmutableList.of() : ImmutableList.copyOf(continuousQueries); } @JsonProperty("strategy") public Strategy getStrategy() { return strategy; } @JsonProperty("collections") public Map<String, CollectionDefinition> getCollections() { return collections; } @JsonProperty("materialized_views") public List<MaterializedView> getMaterializedViewBuilders() { return materializedViews; } @JsonProperty("continuous_queries") public List<ContinuousQuery> getContinuousQueryBuilders() { return continuousQueries; } public static class CollectionDefinition { public final List<Map<String, SchemaFieldInfo>> columns; @JsonCreator public CollectionDefinition(@JsonProperty("columns") List<Map<String, SchemaFieldInfo>> columns) { this.columns = columns; } @JsonIgnore public List<SchemaField> build() { return columns.stream() .map(column -> { Map.Entry<String, SchemaFieldInfo> next = column.entrySet().iterator().next(); return new SchemaField(next.getKey(), next.getValue().type); }).collect(Collectors.toList()); } } public static class SchemaFieldInfo { public final String category; public final FieldType type; @JsonCreator public SchemaFieldInfo(@JsonProperty("category") String category, @JsonProperty("type") FieldType type) { this.category = category; this.type = type; } } public enum Strategy { DEFAULT, SPECIFIC; @JsonCreator public static Strategy get(String name) { return valueOf(name.toUpperCase()); } } }