Hi James, I'm not basing logic on types alone. That aside, here's an example to highlight the specific problem:
{:where [:id 'identity]} Here are two options for sorting by id: 1. {:where [:id 'identity] :sort-by :id :sort '>} 2. {:where [:id (object 'identity {:sort >})} I chose #2, which is immensely helpful when constructing multi-sort queries. I can understand how #2 may raise some eyebrows/questions from a query logic perspective, but I am trying to reduce the scope down to question at hand and not get into unraveling the entire spec. Does that help? & Thanks. On Thursday, December 12, 2013 7:59:26 AM UTC-5, James Reeves wrote: > > It's hard to offer an opinion without some sense of the data structures > you are producing. > > In the case of sorting by identifier, why do you need a new type? It > sounds like you're basing your logic on data types, rather than the data > itself. > > - James > > > On 12 December 2013 04:26, Tim <tcr...@gmail.com <javascript:>> wrote: > >> As an experiment, I've written a DSL that generates database queries >> using *effectively* only the data. The query logic is derived from the data >> assemblance and choice of data structures (or types). I am at the stage >> where I have all the logic working, and I am now moving into perf testing >> and tuning. BUT, before I do, there's this one hack I have implemented that >> has me asking the this question. >> >> As I wrote the DSL I ran out of data structure types to account for a few >> defined meanings within the query logic. As a short term hack I decided to >> attach meta data to symbols where the meta data contained a data value >> along with, for example, a sort option. I only intended for this to be >> short term until I got around to figuring out the semantics of Clojure's >> deftype or defrecord. >> >> Here's the hack: >> >> (defn object [v m] >> (let [id (gensym #"object#")] >> (with-meta id >> (merge m {:default v :id id})))) >> >> >> (defn object? [o] >> (if-let [it (meta o)] >> (if (= (it :id) o) >> true false) >> false)) >> >> (defn inspect >> ([o] >> (inspect o nil)) >> ([o & xs] >> (if-let [it (meta o)] >> (if (= (:id it) o) >> (if-let [x (first xs)] >> (if (coll? x) >> (select-keys it x) >> (x it)) >> it))))) >> >> (defn instance >> ([o] >> (instance o nil)) >> ([o & args] >> (if-let [it (meta o)] >> (if (= (:id it) o) >> (if-let [x (:default it)] >> (if (fn? x) >> (if-let [args (or (and (some identity args) args) (it >> :args))] >> (apply x args) >> (x)) >> x) >> it))))) >> >> >> => (def o (object #(java.util.UUID/randomUUID){:sort '>}) >> object#24397 >> >> => (object? o)) >> true >> >> => (instance o) >> #uuid "3c9cca8b-59e2-46b2-9175-468de3a21a22" >> >> => (inspect o :sort)) >> > >> >> So now I've been reading up on Clojure's deftypes & defrecords and while >> it I expect they are both considered the right tool for the job, >> everything I read seems like overly complicated bloat code compared to my >> hack. Am I missing something? Is this a case where you wouldn't be caught >> dead using the above hack? Why or why not? >> >> As I see it: I'm not creating and/or holding millions of objects that >> would need to be shared, altered or held onto. These have relatively short >> lives that only serve in compiling to a different query language. Type >> hints or java interop really shouldn't matter. >> >> Notes: >> >> 1. While the above function names may carry OO concepts, these functions >> are not intended to fulfil all of them them; rather they only fill a >> specific functionality gap that appears to meet my needs. >> 2. I realize one wouldn't sort on a UUID, it's just an example to show >> the functionality. :) >> >> >> Thanks, >> Tim >> >> -- >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clo...@googlegroups.com<javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.