diff --git a/spec/expressions.yml b/spec/expressions.yml index a182573..dd58b58 100644 --- a/spec/expressions.yml +++ b/spec/expressions.yml @@ -107,19 +107,19 @@ tests: price: 8.99 - # - desc: path with deep wildcards collects all values regardless its level - # scope: - # <<: *goessner - # template: - # prices: $ store.**.price - # result: - # prices: - # - 8.95 - # - 12.99 - # - 8.99 - # - 22.99 - # - 19.95 - # - 1.3 + - desc: path with deep wildcards collects all values regardless its level + scope: + <<: *goessner + template: + prices: $ store.**.price + result: + prices: + - 8.95 + - 12.99 + - 8.99 + - 22.99 + - 19.95 + - 1.3 - desc: path with multiple wildcards returns array of values scope: diff --git a/src/jute/core.cljc b/src/jute/core.cljc index 2c65c7c..32c8334 100644 --- a/src/jute/core.cljc +++ b/src/jute/core.cljc @@ -597,6 +597,14 @@ string-literal (vec (filter #(compiled-pred (assoc scope :this %)) val))) true]) + (= :path-deep-wildcard t) [(fn [val scope is-multiple?] + (->> (if is-multiple? val [val]) + (mapcat (partial tree-seq + (some-fn map? vector?) + #(if (map? %) (vals %) %))) + (remove nil?))) + true] + :else [(let [compiled-expr (compile-expression-ast cmp options path)]