On Wednesday, July 4, 2012 4:12:42 PM UTC-7, Rodrigo Rosenfeld Rosas wrote:
>
>  Em 04-07-2012 19:49, Jeremy Evans escreveu: 
>
> On Wednesday, July 4, 2012 2:39:11 PM UTC-7, Rodrigo Rosenfeld Rosas 
> wrote: 
>>
>> There is a critical part in my application where I need to generate the 
>> SQL by myself. 
>>
>>  It would be easier to process the results of this generated dynamic SQL 
>> if I could iterate over each row by index.
>>
>>  I mean, instead of having DB[sql].all to return something like [{tid: 
>> 23, tname: 'Some name'}, ...] I'd prefer to get something like: [[23, "Some 
>> name"], [...], ...].
>>
>>  Currently I'm doing something like below, but I'd like to know if there 
>> is some method that already does that and that I'm not aware of:
>>
>>  builder = QueryBuilder.new(params)
>> json = DB[builder.sql].map do |r|
>>   r = r.map{|k, v| v} # this is the trick I'm currently using
>>   builder.columns.map do |c|
>>     raw = r.shift
>>     case c[:type]
>>     when 'range' then [raw, r.shift]
>>     ...
>>      else raw
>>   end
>> end
>>
>>  
> You can provide an argument to map:
>
>   ds = DB[builder.sql]
>   ds.map(ds.columns)
>  
>
> Thanks for your support once more, Jeremy.
>
> The problem is that my columns array doesn't contain the alias 
> information. It is something like [{field_id: 687, type: 'string'}, 
> {field_id: 934, type: 'time-span'}, ...]. Even though all my columns are 
> aliased in the generated query, they shouldn't be. I don't rely on their 
> alias for anything but readability. It wouldn't be hard to include the 
> alias in the columns array but it wouldn't be trivial either. And I'd need 
> to add more complexity and tests to my QueryBuilder just to work around a 
> Sequel limitation.
>

ds.columns should should an array of the correct alias symbols (did you try 
it?).  If you do DB['SELECT 1 AS a, 2 as b'].columns  you should get [:a, 
:b].

Note that Dataset#columns may require a query if it call it before getting 
results from the dataset.  You might want to keep your current code and do 
this instead of r.map:

  r = r.values_at(*ds.columns)
 
That way you aren't relying on a specific order in the hash.

>  Your current code (r = r.map{|k, v| v}) is not guaranteed to be portable 
> across adapters (as adapters make no guarantee that hash entry order is the 
> same as column order), and certainly is unlikely to work on ruby 1.8 
> because hashes aren't ordered there.
>  
>
> Yeah, I was aware of that. I'm not worried about 1.8 because I don't use 
> it for several years now. But I wasn't aware that some adapters wouldn't 
> fill the hash in the same order of the columns though.
>

Well, most of them probably do, since that's the simplest way in most 
cases.  However, I wouldn't write code that relies on it. 

Jeremy

>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sequel-talk/-/H_BURCA8dEAJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to