Why not something like:

    {:where [[:id 'identity]] :sort [[:id :desc]]}

That would make it relatively straightforward to merge queries (use `into`
and then check for duplicates in :sort).

To me, it doesn't make a huge amount of sense to tie sorting logic onto the
field itself.

- James


On 12 December 2013 13:56, Tim <tcr1...@gmail.com> wrote:

> 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> 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
>>>
>>> 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
>>>
>>> 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.
>>>
>>> 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.

Reply via email to