4ccc2a6e29bc436368b4978eae9f1c2ae532f139
[dbsrgits/Data-Query.git] / t / example.t
1 use strictures;
2 use Data::Query::ExprDeclare;
3 use Data::Query::Renderer::SQL::Naive;
4 use Moo::Role ();
5 use Devel::Dwarn;
6
7 sub make_renderer {
8   my $class = do {
9     if ($_[0]) {
10       Moo::Role->create_class_with_roles(
11         'Data::Query::Renderer::SQL::Naive',
12         "Data::Query::Renderer::SQL::Slice::$_[0]"
13       )
14     } else {
15       'Data::Query::Renderer::SQL::Naive'
16     }
17   };
18   $class->new;
19 }
20
21 my $renderer = make_renderer;
22
23 sub to_sql {
24   my ($sql, @bindp) = @{$renderer->render($_[0])};
25   ($sql, map $_->{value}, @bindp);
26 }
27
28 DwarnL to_sql(SELECT { $_->foo, "bar" });
29 DwarnL to_sql(SELECT { $_->foo, "bar" } FROM { $_->baz });
30 DwarnL to_sql(SELECT { $_->foo } FROM { $_->baz, AS('quux') });
31 DwarnL to_sql(
32   SELECT { $_->cd->name } FROM { $_->cds, AS('cd') } JOIN { $_->artists }
33 );
34 DwarnL to_sql(
35   SELECT { $_->cd->name }
36   FROM { $_->cds, AS 'cd' }
37   JOIN { $_->artists, AS 'artist' }
38     ON { $_->cd->artistid eq $_->artist->id }
39 );
40 DwarnL to_sql(
41   SELECT { $_->artist->name }
42   FROM { $_->artists, AS 'artist' }
43   LEFT JOIN { $_->cds, AS 'cd' }
44          ON { $_->cd->artistid eq $_->artist->id }
45 );
46 DwarnL to_sql(
47   SELECT { $_->artist->name } WHERE { $_->artist->age > 25 }
48 );
49 DwarnL to_sql(
50   SELECT { $_->cd->name }
51   FROM { $_->cds, AS 'cd' }
52   JOIN { $_->artists, AS 'artist' }
53     ON { $_->cd->artistid eq $_->artist->id }
54   WHERE { $_->artist->age > 25 }
55 );
56 DwarnL to_sql(ORDER BY { $_->foo, $_->bar, $_->baz } DESC);
57
58 my $basic = SELECT { $_->cd->name } FROM { $_->cds, AS 'cd' };
59
60 DwarnL to_sql(
61   FROM { $basic } WHERE { $_->year > 2000 }
62 );
63
64 DwarnL to_sql(
65   FROM { $basic } ORDER BY { $_->year }
66 );
67
68 DwarnL to_sql(
69   SELECT { $_->cd->name } FROM { $_->cds, AS 'cd' } ORDER BY { $_->year }
70 );
71
72 my $lo = 
73   SELECT { $_->cd->name }
74   FROM { $_->cds, AS 'cd' }
75   ORDER BY { $_->year }
76   LIMIT { 10 } OFFSET { 10 };
77
78 sub render_orders {
79
80   $renderer = make_renderer('LimitOffset');
81
82   DwarnL to_sql($lo);
83
84   $renderer = make_renderer('RowNum');
85
86   DwarnL to_sql($lo);
87
88   $renderer = make_renderer('RowNumberOver');
89
90   DwarnL to_sql($lo);
91
92 }
93
94 render_orders();
95
96 $lo =
97   SELECT { $_->cd->name, $_->artist->name }
98   FROM { $_->cds, AS 'cd' }
99   JOIN { $_->artists, AS 'artist' }
100     ON { $_->cd->artistid eq $_->artist->id }
101   WHERE { $_->artist->age > 25 }
102   ORDER BY { $_->artist->age, $_->cd->id }
103   LIMIT { 10 } OFFSET { 20 };
104
105 render_orders();