Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

Ruby Programming Language

Asking for style critics: Collecting the result of a query


May I ask some kind soul to criticize the following piece of code?
I don't have that much experience with Ruby yet, but I feel I could
do it simpler than that.

Problem: Fetch result of a query (it happens to be a SQL query to a
database, but the essential point here is that I need to generate
the resulting lines piecewise, each iteration returning the next
row as an array of values). The result should be returned as a
matrix (i.e. array of arrays). In practice, the number of rows returned
will be well below 1000, each row containing around 10 items.

Here is my code:

    def fetch_result(querystring)
      result=[]
      qres = dbhandle.query(qstr)
      while row = fetch_result.fetch_row # deliver next row
        result.push row # add row to the result array - is this OK?
      end
      result # return result array
    end

I suspect there might be an overhead in appending to an array
new rows piecewise as I'm doing it here. Is there a better way
to do it?

Ronald
--
Ronald Fischer <ronald.fisc@venyon.com>
Phone: +49-89-452133-162

On 05.06.2007 16:12, Ronald Fischer wrote:

Your sample seems to be missing something: Where does "fetch_result"
come into existence?  And why don't you use "qres"?

Attempting to answer your question, if you just append rows without
modification you might as well do fetch_result.to_a.

Kind regards

        robert

If the consumer of these data is just going to iterate over the
resulting array and do stuff with the rows, you might as well just yield
the results and cut out the middleman. It might look something like:

def each_result(query)
  results = dbh.query(query)
  while row = results.fetch_row
    yield row
  end
end

each_result {|row| puts row.inspect}

Of course, if you need an array for any reason, what you're doing
looking fine to me, although doing:

result << row

is more idiomatic ruby, I believe.

- donald

> >     def fetch_result(querystring)
> >       result=[]
> >       qres = dbhandle.query(qstr)
> >       while row = fetch_result.fetch_row # deliver next row
> >         result.push row # add row to the result array - is this OK?
> >       end
> >       result # return result array
> >     end
> Your sample seems to be missing something: Where does "fetch_result"
> come into existence?  And why don't you use "qres"?

Sorry, my fault when condensing the original code to a form better
useful for discussing this issue (and during which I also renamed
variables to make understanding easier in this context). The
line should say:

  while row = qres.fetch_row ....

> Attempting to answer your question, if you just append rows without
> modification you might as well do fetch_result.to_a.

Given my corrections, I guess you would propose

  result = qres.to_a

Right? But this would give:

   warning: default `to_a' will be obsolete

and not return the result. The reason is that qres is, in my case, the
result object for a MySql query, so I think to_a is not applicable here.

Ronald
--
Ronald Fischer <ronald.fisc@venyon.com>
Phone: +49-89-452133-162

On 06.06.2007 09:44, Ronald Fischer wrote:

Hm, it does not implement to_a properly?  I guess then it does not
extend Enumerable as well.  You can do this:

qres.extend(Enumerable).to_a

Kind regards

        robert

Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc