2012-03-12 33 views
6

OLAP küplerinde, çok miktarda toplu halde çok hızlı arama yapmak mümkündür. Bunun başlıca sebebi, operasyonlarda verileri bir araya getirmesi kolay olan (önceden +, -, ortalama, std, max, min ve daha fazlası) bir veri toplanmasıdır.clojure'da önceden toplanmış veri yapısı

Bu "anti-tembel" davranışı clojure'de nasıl edinilir?

Nasıl böyle bir veri tipleri de güncelleme ve bir varlığın veliler de güncellenir emin olmak için

(def world-population {:africa 4e8   ;;this is an aggregation! 
         :africa/liberia 3.4e6 
         :africa/ethiopia 7.4e7 
         ...}) 

gibi bir şey üzerinde düşünüyorum? Kişinin kendi ref-uygulamasını yapması gerekiyor mu?

atomun verilerinizi saklayarak

cevap

3

Bir yüksek mertebeden fonksiyonu olarak bir özyinelemeli toplaması fonksiyonunu yazabiliriz, gibi bir şey: o zaman herhangi bir toplaması operasyon veya hiyerarşi ile kullanılabilir

(defn rollup 
    ([data heirarchy func] 
    (loop [top (second (first heirarchy))] 
     (if (nil? (heirarchy top)) 
     (rollup data heirarchy func top) 
     (recur (heirarchy top))))) 
    ([data heirarchy func root] 
    (let [children (reduce (fn [l [k v]] (if (= v root) (cons k l) l)) '() heirarchy) 
      data (reduce (fn [d c] (if (d c) d (rollup d heirarchy func c))) data children) 
      child-values (map data children)] 
     (assoc data root (apply func child-values))))) 

sizin gibi: Açıkçası

(def populations { :africa/liberia 3.4e6 
        :africa/ethiopia 7.4e7}) 

(def geography {:africa/liberia :africa 
       :africa/ethiopia :africa 
       :africa :world}) 

(rollup populations geography +) 
=> {:africa   7.74E7, 
    :world   7.74E7, 
    :africa/ethiopia 7.4E7, 
    :africa/liberia 3400000.0} 

Çok büyük veri kümeleri veya çoklu hiyerarşileri vb. varsa daha karmaşıklaşır, ancak bu birçok basit durum için yeterli olmalıdır.

+0

Bu harika! Yüksek mertebeden fonksiyonları kullanmanın akıllı yolu! Coğrafya muhtemelen türetmek için iyi bir eşleşme olacak, bununla daha fazla çalışacağız. – claj

4

, sen saatler ekleyebilirsiniz - esasen atom böyle

şey güncellendiğinde geri aramalar: Sen bunun üstüne bazı olay yayılma mantığı inşa edebileceğini

(def world-population (atom {:africa 4e8 
          :africa/liberia 3.4e6 
          ...})) 

(add-watch word-population :population-change-key 
     (fn [key ref old new] 
     (prn "population change"))) 

.

+0

add-watch, yapıyı senkronize tutmanın akıllıca bir yoludur! Bunun için teşekkürler! – claj