From e0f0880b36608feeae848489698025f32b9817cb Mon Sep 17 00:00:00 2001 From: Guillaume Buisson Date: Fri, 5 Feb 2016 17:38:27 +0100 Subject: [PATCH] replaced eithers with conditionals to comply with latest versions of schema --- project.clj | 2 +- src/clj_druid/schemas/aggregation.clj | 32 ++++++++---------- src/clj_druid/schemas/extraction.clj | 13 ++++---- src/clj_druid/schemas/filter.clj | 30 ++++++++--------- src/clj_druid/schemas/fragment.clj | 19 +++++++---- src/clj_druid/schemas/granularity.clj | 7 ++-- src/clj_druid/schemas/having.clj | 11 ++++--- src/clj_druid/schemas/post_aggregation.clj | 38 +++++++++++----------- src/clj_druid/schemas/query.clj | 19 ++++++----- test/clj_druid/validations_test.clj | 37 ++++++++++++--------- 10 files changed, 110 insertions(+), 98 deletions(-) diff --git a/project.clj b/project.clj index fb0dc7c..8704163 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,7 @@ :dependencies [[org.clojure/clojure "1.7.0"] [swiss-arrows "1.0.0"] [clj-http "2.0.0"] - [prismatic/schema "0.4.4"] + [prismatic/schema "1.0.4"] [org.clojure/tools.logging "0.3.1"] [org.clojure/data.json "0.2.6"] [zookeeper-clj "0.9.1"]]) diff --git a/src/clj_druid/schemas/aggregation.clj b/src/clj_druid/schemas/aggregation.clj index b1ea534..40c305a 100644 --- a/src/clj_druid/schemas/aggregation.clj +++ b/src/clj_druid/schemas/aggregation.clj @@ -54,28 +54,22 @@ :name s/Str :fieldName s/Str}) +(s/defschema aggregation + "Aggregations are specifications of processing over metrics available in Druid" + (s/conditional + #(= :count (:type %)) countAggregator + #(= :longSum (:type %)) longSumAggregator + #(= :doubleSum (:type %)) doubleSumAggregator + #(= :min (:type %)) minAggregator + #(= :max (:type %)) maxAggregator + #(= :javascript (:type %)) javascriptAggregator + #(= :cardinality (:type %)) cardinalityAggregator + #(= :hyperUnique (:type %)) hyperUniqueAggregator)) + (s/defschema filteredAggregator "A filtered aggregator wraps any given aggregator, but only aggregates the values for which the given dimension filter matches. This makes it possible to compute the results of a filtered and an unfiltered aggregation simultaneously, without having to issue multiple queries, and use both results as part of post-aggregations." {:type (s/enum :filtered) :filter Filter - :aggregator (s/either countAggregator - longSumAggregator - doubleSumAggregator - minAggregator - maxAggregator - javascriptAggregator - cardinalityAggregator - hyperUniqueAggregator)}) + :aggregator aggregation}) -(s/defschema aggregation - "Aggregations are specifications of processing over metrics available in Druid" - (s/either countAggregator - longSumAggregator - doubleSumAggregator - minAggregator - maxAggregator - javascriptAggregator - cardinalityAggregator - hyperUniqueAggregator - filteredAggregator)) diff --git a/src/clj_druid/schemas/extraction.clj b/src/clj_druid/schemas/extraction.clj index ac421bf..5b6e7f1 100644 --- a/src/clj_druid/schemas/extraction.clj +++ b/src/clj_druid/schemas/extraction.clj @@ -30,12 +30,13 @@ :function s/Str}) (s/defschema extractionFn - (s/either regularExpressionExtractionFunction - partialExtractionFunction - searchQueryExtractionFunction - timeFormatExtractionFunction - timeParsingExtractionFunction - javascriptExtractionFunction)) + (s/conditional + #(= :regex (:type %)) regularExpressionExtractionFunction + #(= :partial (:type %)) partialExtractionFunction + #(= :searchQuery (:type %)) searchQueryExtractionFunction + #(= :timeFormat (:type %)) timeFormatExtractionFunction + #(= :time (:type %)) timeParsingExtractionFunction + #(= :javascript (:type %)) javascriptExtractionFunction)) (s/defschema extraction {:type (s/enum :extraction) diff --git a/src/clj_druid/schemas/filter.clj b/src/clj_druid/schemas/filter.clj index 7d31edd..71a9d9f 100644 --- a/src/clj_druid/schemas/filter.clj +++ b/src/clj_druid/schemas/filter.clj @@ -28,23 +28,23 @@ Selector filters can be used as the base filters for more complex Boolean expres (s/defschema spatialFilter {:type (s/enum :spatial) :dimension s/Str - :bound (s/either - {:type (s/enum :rectangular) - :minCoords [s/Num] - :maxCoords [s/Num]} + :bound (s/conditional + #(= :rectangular (:type %)) {:type (s/enum :rectangular) + :minCoords [s/Num] + :maxCoords [s/Num]} - {:type (s/enum :radius) - :coords [s/Num] - :radius s/Num})}) + #(= :radius (:type %)) {:type (s/enum :radius) + :coords [s/Num] + :radius s/Num})}) (s/defschema Filter "A filter is a JSON object indicating which rows of data should be included in the computation for a query. It’s essentially the equivalent of the WHERE clause in SQL. Druid supports the following types of filters." - (s/either selectorFilter - regexFilter - javascriptFilter - spatialFilter - {:type (s/enum :not) - :field (s/recursive #'Filter)} - {:type (s/enum :or :and) - :fields [(s/recursive #'Filter)]})) + (s/conditional + #(= :selector (:type %)) selectorFilter + #(= :regex (:type %)) regexFilter + #(= :javascript (:type %)) javascriptFilter + #(= :spatial (:type %)) spatialFilter + #(or (= :or (:type %)) + (= :and (:type %))) {:type (s/enum :or :and) + :fields [(s/recursive #'Filter)]})) diff --git a/src/clj_druid/schemas/fragment.clj b/src/clj_druid/schemas/fragment.clj index b4a4a36..5d9521c 100644 --- a/src/clj_druid/schemas/fragment.clj +++ b/src/clj_druid/schemas/fragment.clj @@ -30,9 +30,10 @@ (s/defschema dimensionSpec "define how dimension values get transformed prior to aggregation" - (s/either s/Str - defaultDimension - extraction)) + (s/conditional + #(= :default (:type %)) defaultDimension + #(= :extraction (:type %)) extraction + :else s/Str)) (s/defschema orderByColumnSpec "Druid orderByColumnSpec option schema" @@ -67,9 +68,15 @@ (s/defschema topNMetricSpec "topN metric option schema" - (s/either {:type (s/enum :numeric :lexicographic :alphaNumeric :inverted) - (s/optional-key :metric) s/Str - (s/optional-key :previousStop) s/Str} s/Str)) + (s/conditional + #(map? %) {:type (s/enum + :numeric + :lexicographic + :alphaNumeric + :inverted) + (s/optional-key :metric) s/Str + (s/optional-key :previousStop) s/Str} + :else s/Str)) (s/defschema segmentMetadataToInclude "Druid SegmentMetadata toInclude option schema" diff --git a/src/clj_druid/schemas/granularity.clj b/src/clj_druid/schemas/granularity.clj index 0e2c974..9381901 100644 --- a/src/clj_druid/schemas/granularity.clj +++ b/src/clj_druid/schemas/granularity.clj @@ -28,9 +28,10 @@ minutes and seconds (e.g. P2W, P3M, PT1H30M, PT0.750S) in ISO8601 format." (s/defschema granularity "The granularity field determines how data gets bucketed across the time dimension, or how it gets aggregated by hour, day, minute, etc." - (s/either simpleGranularity - durationGranularity - periodGranularity)) + (s/conditional + #(= :duration (:type %)) durationGranularity + #(= :period (:type %)) periodGranularity + :else simpleGranularity)) diff --git a/src/clj_druid/schemas/having.clj b/src/clj_druid/schemas/having.clj index 2f0ca80..c6b3692 100644 --- a/src/clj_druid/schemas/having.clj +++ b/src/clj_druid/schemas/having.clj @@ -19,8 +19,9 @@ :value Long}) (s/defschema having - (s/either havingEqualTo - havingGreaterThan - havingLessThan - {:type (s/enum :or :not :and) - :havingSpecs (s/recursive #'having)})) + (s/conditional + #(= :equalTo (:type %)) havingEqualTo + #(= :greaterThan (:type %)) havingGreaterThan + #(= :lessThan (:type %)) havingLessThan + :else {:type (s/enum :or :not :and) + :havingSpecs (s/recursive #'having)})) diff --git a/src/clj_druid/schemas/post_aggregation.clj b/src/clj_druid/schemas/post_aggregation.clj index 32066dd..49f59fb 100644 --- a/src/clj_druid/schemas/post_aggregation.clj +++ b/src/clj_druid/schemas/post_aggregation.clj @@ -30,12 +30,12 @@ {:type (s/enum :arithmetic) :name s/Str :fn (s/enum "+" "-" "*" "/" "quotient") - :fields [(s/either - (s/recursive #'arithmeticPostAggregator) - fieldAccessPostAggregator - constantPostAggregator - javascriptPostAggregator - hyperUniqueCardinalityPostAggregator)] + :fields [(s/conditional + #(= :arithmetic (:type %)) (s/recursive #'arithmeticPostAggregator) + #(= :fieldAccess (:type %)) fieldAccessPostAggregator + #(= :constant (:type %)) constantPostAggregator + #(= :javascript (:type %)) javascriptPostAggregator + #(= :hyperUniqueCardinality (:type %)) hyperUniqueCardinalityPostAggregator)] (s/optional-key :ordering) (s/enum nil "numericFirst")}) @@ -93,16 +93,16 @@ Offset determines the value on which those interval bins align." :probabilities [s/Any]}) (s/defschema postAggregation - (s/either arithmeticPostAggregator - fieldAccessPostAggregator - constantPostAggregator - javascriptPostAggregator - hyperUniqueCardinalityPostAggregator - - equalBucketsPostAggregator - bucketsPostAggregator - customBucketsPostAggregator - minPostAggregator - maxPostAggregator - quantilePostAggregator - quantilesPostAggregator)) + (s/conditional + #(= :arithmetic (:type %)) arithmeticPostAggregator + #(= :fieldAccess (:type %)) fieldAccessPostAggregator + #(= :constant (:type %)) constantPostAggregator + #(= :javascript (:type %)) javascriptPostAggregator + #(= :hyperUniqueCardinality (:type %)) hyperUniqueCardinalityPostAggregator + #(= :equalBuckets (:type %)) equalBucketsPostAggregator + #(= :buckets (:type %)) bucketsPostAggregator + #(= :customBuckets (:type %)) customBucketsPostAggregator + #(= :min (:type %)) minPostAggregator + #(= :max (:type %)) maxPostAggregator + #(= :quantile (:type %)) quantilePostAggregator + #(= :quantiles (:type %)) quantilesPostAggregator)) diff --git a/src/clj_druid/schemas/query.clj b/src/clj_druid/schemas/query.clj index e85e3ef..65473e2 100644 --- a/src/clj_druid/schemas/query.clj +++ b/src/clj_druid/schemas/query.clj @@ -84,7 +84,9 @@ TopNs are much faster and resource efficient than GroupBys for this use case." (s/optional-key :pagingSpec) pagingSpec (s/optional-key :limitSpec) limitSpec (s/optional-key :filter) Filter - (s/optional-key :context) context}) + ;;(s/optional-key :context) context + } + ) (s/defschema segmentMetadata "Segment metadata queries return per segment information" @@ -105,13 +107,14 @@ TopNs are much faster and resource efficient than GroupBys for this use case." (s/defschema query "druid query router" - (s/either groupBy - search - segmentMetadata - timeBoundary - timeseries - topN - select)) + (s/conditional + #(= :groupBy (:queryType %)) groupBy + #(= :search (:queryType %)) search + #(= :segmentMetadata (:queryType %)) segmentMetadata + #(= :timeBoundary (:queryType %)) timeBoundary + #(= :timeSeries (:queryType %)) timeseries + #(= :topN (:queryType %)) topN + #(= :select (:queryType %)) select)) (def queries {:groupBy groupBy :search search diff --git a/test/clj_druid/validations_test.clj b/test/clj_druid/validations_test.clj index 202c78c..95c6de6 100644 --- a/test/clj_druid/validations_test.clj +++ b/test/clj_druid/validations_test.clj @@ -91,13 +91,18 @@ (def valid-select-query - {:queryType :select - :dataSource "wikipedia" - :dimensions [] - :metrics [] - :granularity :all - :intervals ["2013-01-01/2013-01-02"] - :pagingSpec {:pagingIdentifiers {} :threshold 5}}) + {:queryType :select + :dataSource "wikipedia" + :dimensions [] + :metrics [] + :granularity :all + :intervals ["2013-01-01/2013-01-02"] + :filter {:type :spatial + :dimension "test" + :bound {:type :rectangular + :minCoords [1 2] + :maxCoords [3 4]}} + :pagingSpec {:pagingIdentifiers {} :threshold 5}}) (def valid-topN-query @@ -106,32 +111,32 @@ :threshold 5 :metric "count"})) - (deftest test-valid-groupby-query - (is (= (validate-groupby valid-groupby-query) - valid-groupby-query))) +(deftest test-valid-groupby-query + (is (= (validate-groupby valid-groupby-query) + valid-groupby-query))) (deftest test-valid-search-query (is (= (validate-search valid-search-query) - valid-search-query))) + valid-search-query))) (deftest test-valid-segment-metadata-query (is (= (validate-segment-metadata valid-segment-metadata-query) - valid-segment-metadata-query))) + valid-segment-metadata-query))) (deftest test-valid-time-boundary-query (is (= (validate-time-boundary valid-time-boundary-query) - valid-time-boundary-query))) + valid-time-boundary-query))) (deftest test-valid-timeseries-query (is (= (validate-timeseries valid-timeseries-query) - valid-timeseries-query))) + valid-timeseries-query))) (deftest test-valid-topN-query (is (= (validate-topN valid-topN-query) - valid-topN-query))) + valid-topN-query))) (deftest test-valid-select-query (is (= (validate valid-select-query :select) - valid-select-query))) + valid-select-query)))