Skip to content

Commit

Permalink
support filtering of selects - closes #5, closes #14
Browse files Browse the repository at this point in the history
  • Loading branch information
JulesGosnell committed Feb 3, 2010
1 parent 178bf52 commit d6df9e6
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 5 deletions.
31 changes: 28 additions & 3 deletions src/main/clojure/org/dada/core.clj
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
(ns org.dada.core
(:import (clojure.lang DynamicClassLoader)
(java.beans PropertyDescriptor)
(org.dada.core Getter GetterMetadata Model Transformer Transformer$Transform Update VersionedModelView View)
(org.dada.core
FilteredView
FilteredView$Filter
Getter
GetterMetadata
Model
Transformer
Transformer$Transform
Update
VersionedModelView
View)
(org.dada.demo Client)
(org.springframework.context.support ClassPathXmlApplicationContext)
(org.dada.asm ClassFactory)))
Expand Down Expand Up @@ -138,6 +148,18 @@
(apply make-instance view-class (map (fn [getter] (getter input)) getters)))
)))

(defn make-filter [filter-fn view]
(FilteredView.
(proxy
[FilteredView$Filter]
[]
(filter
[value]
;; TODO: this code needs to be FAST - executed online
(filter-fn value)))
(list view)
))

;; (transform input-model src-class property-map input-names view output-class)
(defn transform [model model-class property-map sel-getters tgt-names view view-class]
(if (= tgt-names (keys property-map))
Expand Down Expand Up @@ -182,7 +204,6 @@
;; TODO
;; allow selection from a number of src-models
;; allow selection into a number of src views
;; allow filtering :filter <filter-fn>
;; allow splitting :split <split-fn> implemented by router - should provide fn for tgt-view construction...
;; abstract out tgt-view construction so it can be done from parameters, during select, or on-demand from router...

Expand All @@ -200,6 +221,7 @@
;; what is an :into param was given...none of this needs calculating...
tgt-class-name (or (pmap :class) (.toString (gensym "org.dada.tmp.OutputValue")))
tgt-model-name (or (pmap :model) (.toString (gensym "OutputModel")))
filter-fn (pmap :filter)
tgt-types (map (fn [field] (nth field 0)) fields)
tgt-names (map (fn [field] (nth field 1)) fields)
sel-getters (map (fn [field] (nth field 2)) fields)
Expand All @@ -211,7 +233,10 @@
tgt-version-getter (tgt-getter-map src-version-name)
tgt-metadata (new GetterMetadata tgt-class tgt-types tgt-names tgt-getters)
view (VersionedModelView. tgt-model-name tgt-metadata tgt-key-getter tgt-version-getter)
transformer (transform src-model src-class src-type-map sel-getters tgt-names view tgt-class)]
transformer (make-transformer sel-getters view tgt-class)
filter (make-filter filter-fn transformer)
]
(connect src-model filter)
view)
)

Expand Down
6 changes: 4 additions & 2 deletions src/main/clojure/org/dada/demo/whales.clj
Original file line number Diff line number Diff line change
Expand Up @@ -109,5 +109,7 @@
output))

;; select whales into a new model...
(def small (fetch model "time" "version" '(["time"] ["version"] ["type"]) :model "Small"))
(def smaller (fetch small "time" "version" '(["time"] ["version"]) :model "Smaller"))
(def narwhals (fetch model "time" "version" '(["time"] ["version"] ["type"]) :model "Narwhals2" :filter (fn [value] (= "narwhal" (. value getType)))))

(def belugas (fetch model "time" "version" '(["time"] ["version"] ["type"]) :model "Belugas" :filter (fn [value] (= "beluga whale" (. value getType)))))

81 changes: 81 additions & 0 deletions src/main/java/org/dada/core/FilteredView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright (c) 2009, Julian Gosnell
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.dada.core;

import java.util.ArrayList;
import java.util.Collection;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FilteredView<K, V> implements View<K, V> {

private final Logger logger = LoggerFactory.getLogger(getClass());

public interface Filter<V> {
boolean filter(V value);
}

private final Filter<V> filter;
private final Collection<View<K, V>> views;

public FilteredView(Filter<V> filter, Collection<View<K, V>> views) {
this.filter = filter;
this.views = views;
}

@Override
public void update(Collection<Update<V>> insertions, Collection<Update<V>> updates, Collection<Update<V>> deletions) {
Collection<Update<V>> i = new ArrayList<Update<V>>();
for (Update<V> insertion : insertions) {
if (filter.filter(insertion.getNewValue()))
i.add(insertion);
}
Collection<Update<V>> u = new ArrayList<Update<V>>();
for (Update<V> update : updates) {
if (filter.filter(update.getOldValue()))
u.add(update);
}
Collection<Update<V>> d = new ArrayList<Update<V>>();
for (Update<V> deletion : deletions) {
if (filter.filter(deletion.getOldValue()))
d.add(deletion);
}

for (View<K, V> view: views) {
try {
view.update(i, u, d);
} catch (Throwable t) {
logger.error("problem updating View: ", t);
}
}

}

}

0 comments on commit d6df9e6

Please sign in to comment.