为什么这个数据记录查询会聚合?

时间:2014-11-16 00:31:16

标签: clojure clojurescript datalog

From https://github.com/tonsky/datascript

(->
 (d/q '[:find ?color (max ?amount ?x) (min ?amount ?x)
        :in   [[?color ?x]] ?amount]
      [[:red 10]  [:red 20] [:red 30] [:red 40] [:red 50]
       [:blue 7] [:blue 8]]
      4)
 pr-str
 js/console.log)
;;; ([:red [20 30 40 50] [10 20 30 40]] [:blue [7 8] [7 8]]) 

(->
 (d/q '[:find ?color (max ?amount ?x) (min ?amount ?x)
        :in   [[?color ?x]] ?amount]
      [[:red 10]  [:red 20] [:red 30] [:red 40] [:red 50]
       [:blue 7] [:blue 8]]
      3)
 pr-str
 js/console.log)
;;; ([:red [30 40 50] [10 20 30]] [:blue [7 8] [7 8]]) 

(->
 (d/q '[:find ?color (max ?amount ?x) (min ?amount ?x)
        :in   [[?color ?x]] ?amount]
      [[:red 10]  [:red 20] [:red 30] [:red 40] [:red 50]
       [:blue 7] [:blue 8]]
      2)
 pr-str
 js/console.log)
;;; ([:red [40 50] [10 20]] [:blue [7 8] [7 8]]) 

所以,这不是一个关于它在做什么的问题,这是一个关于它是如何(或至少为什么)这样做的问题。 max和min分别是返回其后续整数的最大值或最小值的函数。 ?amount如何考虑限制聚合计数?为什么这些东西总是聚集在一起?代码如何运行以便聚合。我真的不知道这段代码是如何生成它所产生的结果的。

1 个答案:

答案 0 :(得分:2)

maxmin在数据库查询中是overloaded

一元(min ?x)(max ?x)函数聚合返回一个数字。

二元(min ?n ?x)(max ?n ?x)函数聚合返回?n长度限制的项集合。