Login | Register
My pages Projects Community openCollabNet

propel
Reply to message

* = Required fields
* Subject
* Body
Attachments
Send reply to
Topic
Author (directly in email)
Please type the letters in the image above.

Original message

Author =?ISO-8859-1?Q?David_Z=FClke?= <dz@bitxtender.com>
Full name =?ISO-8859-1?Q?David_Z=FClke?= <dz@bitxtender.com>
Date 2006-10-04 07:57:22 PDT
Message My thoughts here:

1) I just realized how much overhead we have when fetching results:

while($row = $stmt->fetch(PDO​::FETCH_NUM)) {
    $obj = new $cls();
    $obj->hydrate($row);
    $results[] = $obj;
}

We can use PDO::FETCH_CLASS here. PDO will then create a new "Book"
instance and set the fields. We can even pass constructor arguments,
very schweet. I think I'll test this later. This is a non-breaking
change for 1.3 that should make things a bit faster.


2) Regarding this iterator thing. I guess the best idea would be to
use PDO to populate the results, basically as above. I don't think we
need FETCH_INTO, though. Consider the following situation:

foreach (BookPeer::doSelect($c) as $book) {
    echo $book->getTitle();
}

With an iterator, each book objekt would be created and returned on
the fly. I realize that there's no way to force the GC to kick in,
but after some rows, it will discard the "old" objects still in
memory (i.e. those who'se titles have been echoed already).

I don't really see a need for FETCH_INTO there!?


David



Am 04.10.2006 um 11:56 schrieb Sven Tietje:

> David Zulke wrote:
>> 1) memory consumption is a lot lower, e.g. when iterating over 1000
>> rows to display them, a row is fetched, the data is displayed, and
>> the GC can then go ahead and destroy the object.
>
> Think, that should be an option. Sometimes, i want do iterator over a
> resultset and to write baseobjects with special information into an
> array or
> something like that. PDO handles it the same way - Fetchmode gives you
> special options for fetching as object:
>
> http://de.php.net/ma​nual/de/function.pdo​statement-setfetchmo​de.php
> Using PDO::FETCH_CLASS will result into an object-instance for each
> row: 200
> rows in your resultset will give you 200 object-instances.
>
> PDO::FETCH_INTO will give you the same object-instance for each
> row: 200
> rows, but one object-instance.
>
> Having the same feature / option for propel would be nice:
>
> 1. One Instance for all rows
> $resultset = TablePeer::doSelect(new Criteria(), PROPEL::ONE_OBJECT);
>
> foreach ($resultset as $row) {
> echo $row //will give you the same object instance
> }
>
> I would use PROPEL::ONE_OBJECT to publish big resultsets. I don`t
> manipulate
> the object. With $myrow = clone $row it is possible to get my own
> instance
> of the row.
>
> 2. An Instance for each row
> $resultset = TablePeer::doSelect(new Criteria(), PROPEL::EACH_OBJECT);
> foreach ($resultset as $row) {
> echo $row //will result in Object#1, Object#2 ..... Object#200
> }
>
> Internally Propel uses clone() to create a single instance of each
> row.
>
>> 2) it opens the door for a potential
>> CategoryPeer::doSele​ctJoinProducts() support, where fetching 1:n
>> relations with a join would become possible.
>
> We should discuss to use
> PDOStatement::setFetchMode ( int PDO::FETCH_CLASS, string
> classname ) or
> PDOStatement::setFetchMode ( int PDO::FETCH_INTO, object object )
> instead of hydrate();
>
> I wrote a little script to test it:
>
> $stmt = $pdo->prepare('select name as `customer.name` from customer');
> $stmt->execute(array());
>
> class baseobject /*implements ArrayAccess*/ {
> private $data = array(
> 'customer.name' => null,
> );
>
> // for hydrate
> public function __set($key, $value) {
> $this->data[$key] = $value;
> }
>
> public function setName($value) {
> $this->data['customer.name'] = $value;
> }
>
> public function getName() {
> if (isset($this->da​ta['customer.name'])​) {
> return $this->data['cus​tomer.name'];
> }
>
> }
> }
>
> $blub = new baseobject;
> $stmt->setFetchM​ode(PDO::FETCH_INTO,​ $blub);
>
> $arg = array();
> while ($b = $stmt->fetch()) {
> // $b->setName('blah');
> var_dump($b->getName());
> }
>
> Implement ArrayAccess into an BaseObject could be a possibility,
> too. We
> should discuss it.
>
> Your opinion? I think to use the power of pdo would be nice.
>
> --------------------​--------------------​--------------------​---------
> To unsubscribe, e-mail: dev-unsubscribe@prop​el.tigris.org
> For additional commands, e-mail: dev-help at propel dot tigris dot org
>
>