2014-11-16 3 views
1

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은 집계 횟수를 제한하는 것에 어떻게 반영됩니까? 어쨌든 이러한 것들이 왜 모여 있습니까? 코드가 집계되는 방식으로 실행되는 방법. 이 코드가 결과를 생성하기 위해 어떻게 흐르고 있는지 실제로 알 수 없습니다.

답변

2

maxmin은 데이터 쿼리에서 overloaded입니다.

unary (min ?x)(max ?x) 함수는 단일 숫자를 반환하기 위해 aggreate합니다.

이진 (min ?n ?x)(max ?n ?x) 함수는 길이가 제한된 컬렉션을 ?n으로 반환하기 위해 생성됩니다.

+0

: (max N coll)은 coll의 상위 N 값입니다. 최소값과 동일합니다. 최소값은 N입니다. –