#!/usr/bin/env perl use strict; use warnings; use File::Basename; use lib File::Basename::dirname(__FILE__)."/../../../lib"; use lib File::Basename::dirname(__FILE__)."/../.."; use UR; use URT::DataSource::SomeSQLite; use Test::More tests => 3; # tests a get() where the delegated property's join chain has a UR::Value class in the middle # # Before the fix, the QueryPlan would see that UR::Values are not resolvable in the DB, and so # stops trying to connect joins together, leading to multiple queries. The fix was to splice # out these non-db joins while constructing the SQL my $dbh = URT::DataSource::SomeSQLite->get_default_handle; $dbh->do('create table person (person_id integer not null primary key, name varchar not null)'); $dbh->do('create table attribute (attr_id integer not null primary key, person_id integer references person(person_id), key varchar, value varchar)'); $dbh->do('create table car (car_id integer not null primary key, make varchar, model varchar)'); $dbh->do("insert into person values (1,'Bob')"); $dbh->do("insert into car values (2,'Chevrolet','Impala')"); $dbh->do("insert into attribute values (3,1,'car_id', 2)"); UR::Object::Type->define( class_name => 'Person', data_source => 'URT::DataSource::SomeSQLite', table_name => 'person', id_by => [ person_id => { is => 'Integer' }, ], has => [ name => { is => 'String', }, attributes => { is => 'Attribute', reverse_as => 'person', is_many => 1 }, car_id => { is => 'Integer', via => 'attributes', to => 'value', where => [key => 'car_id'] }, car => { is => 'Car', id_by => 'car_id' }, car_make => { is => 'String', via => 'car', to => 'make' }, ], ); UR::Object::Type->define( class_name => 'Attribute', data_source => 'URT::DataSource::SomeSQLite', table_name => 'attribute', id_by => [ attr_id => { is => 'Integer' }, ], has => [ person => { is => 'Person', id_by => 'person_id' }, key => { is => 'String', }, value => { is => 'String', }, ], ); UR::Object::Type->define( class_name => 'Car', data_source => 'URT::DataSource::SomeSQLite', table_name => 'car', id_by => [ car_id => { is => 'Integer' }, ], has => [ make => { is => 'String' }, model => { is => 'String' }, ], ); my $query_count = 0; ok(URT::DataSource::SomeSQLite->create_subscription( method => 'query', callback => sub { $query_count++ }), 'Created a subscription for query'); my $p = Person->get(car_make => 'Chevrolet'); ok($p, 'Got the person'); is($query_count, 1, 'Made one query');