my $q = SODA::Query->new(); $q->constrain(isa => 'Person'); $q->descend('age')->constrain(greater => 30); Person => (age > 30) +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries |--+ +------------------+ +-------------+ | | isa => 'Person' | | +------------------+ | ('age') | +-------------+ +---->| SODA::Query | +-------------+ +------------------+ | constraints |--->| SODA::Constraint | | sub-queries | +------------------+ +-------------+ | greater => 30 | +------------------+ my $q = SODA::Query->new(); $q->constrain(isa => 'Person'); $q->descend('age') ->constrain(greater => 30) ->and( $q->descend('age') ->constrain(smaller => 35) ); Person => (age > 30) AND (age < 35) +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries |--+ +------------------+ +-------------+ | | isa => 'Person' | | +------------------+ | ('age') | +-------------+ +---->| SODA::Query | +-------------+ +------------------+ | constraints |--+-->| SODA::Constraint | | sub-queries | | +------------------+ +-------------+ | | greater => 30 | | |------------------| | | and |--+ | +------------------+ | | | | +------------------+ | +-->| SODA::Constraint |<-+ +------------------+ | smaller => 35 | +------------------+ my $q = SODA::Query->new(); $q->constrain(isa => 'Person'); $q->descend('age') ->constrain(greater => 30) ->and( $q->descend('age') ->constrain(smaller => 35) )->or( $q->descend('age') ->constrain(equal => 55) ); Person => (age > 30) AND (age < 35) OR (age = 55) +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries |--+ +------------------+ +-------------+ | | isa => 'Person' | | +------------------+ | ('age') | +-------------+ +---->| SODA::Query | +-------------+ +------------------+ | constraints |--+-->| SODA::Constraint | | sub-queries | | +------------------+ +-------------+ | | greater => 30 | | |------------------| | | or |-----+ | | and |--+ | | +------------------+ | | | | | | +------------------+ | | +-->| SODA::Constraint |<-+ | | +------------------+ | | | smaller => 35 | | | +------------------+ | | | | +------------------+ | +-->| SODA::Constraint |<----+ +------------------+ | equal => 55 | +------------------+ my $q = SODA::Query->new(); $q->constrain(isa => 'Person'); $q->descend('age') ->constrain(greater => 30) ->and( $q->descend('age') ->constrain(smaller => 35) ->or( $q->descend('age') ->constrain(equal => 55) ) ); Person => (age > 30) AND ((age < 35) OR (age = 55)) +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries |--+ +------------------+ +-------------+ | | isa => 'Person' | | +------------------+ | ('age') | +-------------+ +---->| SODA::Query | +-------------+ +------------------+ | constraints |--+-->| SODA::Constraint | | sub-queries | | +------------------+ +-------------+ | | greater => 30 | | |------------------| | | and |--+ | +------------------+ | | | | +------------------+ | +-->| SODA::Constraint |<-+ | +------------------+ | | smaller => 35 | | |------------------| | | or |--+ | +------------------+ | | | | +------------------+ | +-->| SODA::Constraint |<-+ +------------------+ | equal => 55 | +------------------+ my $q = SODA::Query->new(); $q->constrain(instance_of => 'Session'); $q->descend('user') ->descend('user_name') ->constrain(equal => 'stvn'); Session => (Session.user.user_name == 'stvn') +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries |--+ +------------------+ +-------------+ | | isa => 'Session' | | +------------------+ | ('user') | +-------------+ +---->| SODA::Query | +-------------+ | constraints | | sub-queries |--+ +-------------+ | | ('user_name') | | +-------------+ +-->| SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries | +------------------+ +-------------+ | equal => 'stvn' | +------------------+ my $q = SODA::Query->new(); $q->constrain(isa => 'Person'); $q->descend('age')->constrain(greater => 30); my $q2 = SODA::Query->new(); $q2->constrain(isa => 'Address'); $q2->descend('zipcode')->constrain(equal => 10018); $q->join(address_id => $q2); Person, Address => (Person.addresss_id == Address.address_id) AND ((Person.age > 30) AND (Address.zipcode = 10018)) +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |------------>| SODA::Constraint | | sub-queries |--------+ +------------------+ |-------------| | | isa => 'Person' | | joins |--+ | +------------------+ +-------------+ | | | ('age') | | +-------------+ | +---->| SODA::Query | | +-------------+ +------------------+ ('address_id') | constraints |--->| SODA::Constraint | | | sub-queries | +------------------+ | +-------------+ | greater => 30 | V +------------------+ +-------------+ | SODA::Query | +-------------+ +------------------+ | constraints |---->| SODA::Constraint | | sub-queries |--+ +------------------+ +-------------+ | | isa => 'Address' | | +------------------+ | ('zipcode') | +-------------+ +---->| SODA::Query | +-------------+ +------------------+ | constraints |--->| SODA::Constraint | | sub-queries | +------------------+ +-------------+ | equal => 10018 | +------------------+