Gareth,

this is awesome! Thanks for taking the time to answer in detail, I get
it now and my horizon just expanded "by a bit"..... *drumroll!* ;)

Really, thanks, this is cool. Great link as well, I'll be reading up
on this.

Have a great day!
Daniel


On Apr 29, 10:48 pm, Gareth McCumskey <gmccums...@gmail.com> wrote:
> Oh yes and per your original question .. the Criteria:BINARY_AND is a way to
> tell your database to do a bitwise comparison. In SQL that would be & (not
> &&) just like in PHP.
>
> On Thu, Apr 30, 2009 at 7:45 AM, Gareth McCumskey <gmccums...@gmail.com>wrote:
>
>
>
> > It uses an integer type, or tiny int if you will not be using many types.
> > The bitwise operations don't need any specific type. If you want more info
> > there is a nice little tutorial at
> >http://www.litfuel.net/tutorials/bitwise.htm. That should explain better.
> > Perhaps another small example here would help. This is directly from our
> > code, from a batch script that does not use symfony to transfer
> > classifications from the old "column per classification" schema of the old
> > system mentioned in my blog post to the new schema using binary:
>
> > $classification_value = 0;
>
> > $classification_value = $get_batch_result->fields['isspam'] == 1 ?
> > $classification_value + 1 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['ishighspam'] == 1 ?
> > $classification_value + 2 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['issaspam'] == 1 ?
> > $classification_value + 4 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['isrblspam'] == 1 ?
> > $classification_value + 8 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['isfp'] == 1 ?
> > $classification_value + 16 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['spamwhitelisted'] == 1 ?
> > $classification_value + 32 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['spamblacklisted'] == 1 ?
> > $classification_value + 64 : $classification_value;
>
> >  $classification_value = $get_batch_result->fields['virusinfected'] == 1 ?
> > $classification_value + 128 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['nameinfected'] == 1 ?
> > $classification_value + 256 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['otherinfected'] == 1 ?
> > $classification_value + 512 : $classification_value;
>
> > $classification_value = $get_batch_result->fields['quarantined'] == 1 ?
> > $classification_value + 1024 : $classification_value;
>
> > The reason it works is because in PHP you can take a value from the
> > classification and do a bitwise if:
>
> > if ($classification_value & 512)
>
> > So if the classification value had 512 (otherinfected) added onto it the
> > result would be true. Another example is if I had a classification value of
> > 768:
>
> > if ($classification_value & 512)
>
> > would still return true as well as:
>
> > if ($classification_value & 256)
>
> > and nothing else would because 512 + 256 = 768.
>
> > Hope that helps a bit more
>
> > On Thu, Apr 30, 2009 at 1:47 AM, Richtermeister <nex...@gmail.com> wrote:
>
> >> Hi Gareth,
>
> >> thanks for the explanation. The part about the 1, 2, 4, 8 step I get..
> >> but to me those would still be integers.. albeit not continuous.
> >> I guess I am just not familiar with the bit datatype and how it is
> >> used.
>
> >> If you don't mind me asking, what database storage type does this use?
>
> >> Thanks,
> >> Daniel
>
> >> On Apr 29, 2:38 pm, Gareth McCumskey <gmccums...@gmail.com> wrote:
> >> > If you used just integers then you wouldn't be able to work backwards
> >> from
> >> > the totalled number. For example:
>
> >> > - is_low_socring = 1
> >> > - is_high_scoring = 2
> >> > - is_virus = 3
> >> > - is_badcontent = 4
>
> >> > If I had something that was just bad content it would be a 4. But If I
> >> had
> >> > something that was low_scoring and a virus it would also be 4... hmmm.
> >> But
> >> > if I use binary...
>
> >> > - is_low_socring = 1
> >> > - is_high_scoring = 2
> >> > - is_virus = 4
> >> > - is_badcontent = 8
>
> >> > ONLY bad_content can be an 8, only low_scoring AND virus can be a 5 ..
> >> etc
> >> > etc.
>
> >> > Hope that helps
>
> >> > On Wed, Apr 29, 2009 at 6:01 PM, Richtermeister <nex...@gmail.com>
> >> wrote:
>
> >> > > Hi Gareth,
>
> >> > > I just read your blog entry on that subject, and I have to admit that
> >> > > it never occurred to me to use bits to store multiple flags in one
> >> > > column. I like it! :) Thanks.
>
> >> > > My question, if I may, is why the classification column is not just an
> >> > > integer? What is the Criteria::BINARY_AND for?
>
> >> > > Thanks for enlightening me :)
> >> > > Have a great day.
> >> > > Daniel
>
> >> > > On Apr 29, 1:09 am, Gareth McCumskey <gmccums...@gmail.com> wrote:
> >> > > > Hi all,
>
> >> > > > I need the great minds that populate this liust to assist me with a
> >> small
> >> > > > dilema. We currently use an integer field that stores a range of
> >> values
> >> > > as a
> >> > > > bitwise number depending on certain criteria of an item stored in
> >> the db.
> >> > > > What we want to do now is write a sql query like:
>
> >> > > > SELECT [columns] FROM [tablename] WHERE classification & 1 AND
> >> > > > classification & ~2
>
> >> > > > I am struggling to find the negation (~) operator as part of the
> >> criteria
> >> > > > syntax. So far I have:
>
> >> > > > $status_criterion =
> >> $c->getNewCriterion(MailDetailsPeer::CLASSIFICATION,
> >> > > 1,
> >> > > > Criteria::BINARY_AND);
>
> >> $status_criterion->addAnd($c->getNewCriterion(MailDetailsPeer::CLASSIFICATION,
> >> > > > 2 , Criteria::BINARY_AND));
>
> >> > > > As you can see I have no negation on the second-line because I do
> >> not
> >> > > know
> >> > > > how I should do that. There aren't any obvious options as part of
> >> Propel.
>
> >> > > > ANy help would be appreciated guys :)
>
> >> > > > --
> >> > > > Gareth McCumskeyhttp://garethmccumskey.blogspot.com
> >> > > > twitter: @garethmcc
>
> >> > --
> >> > Gareth McCumskeyhttp://garethmccumskey.blogspot.com
> >> > twitter: @garethmcc
>
> > --
> > Gareth McCumskey
>
> >http://garethmccumskey.blogspot.com
> > twitter: @garethmcc
>
> --
> Gareth McCumskeyhttp://garethmccumskey.blogspot.com
> twitter: @garethmcc
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"symfony users" group.
To post to this group, send email to symfony-users@googlegroups.com
To unsubscribe from this group, send email to 
symfony-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/symfony-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to