File Coverage

blib/lib/Attean/API.pm
Criterion Covered Total %
statement 185 216 85.6
branch 20 32 62.5
condition 6 12 50.0
subroutine 47 56 83.9
pod 3 9 33.3
total 261 325 80.3


line stmt bran cond sub pod time code
1 50     50   508 use v5.14;
  50         135  
2 50     50   226 use warnings;
  50         90  
  50         2168  
3              
4             =head1 NAME
5              
6             Attean::API - Utility package for loading all Attean role packages.
7              
8             =head1 VERSION
9              
10             This document describes Attean::API version 0.032
11              
12             =head1 SYNOPSIS
13              
14             use v5.14;
15             use Attean;
16              
17             =head1 DESCRIPTION
18              
19             This is a utility package that will load all the Attean-related Moo roles
20             in the Attean::API namespace.
21              
22             =head1 METHODS
23              
24             =over 4
25              
26             =cut
27              
28             use Moo::Role;
29 50     50   20257 }
  50         606866  
  50         262  
30              
31             use Moo::Role;
32             with 'Attean::API::Term', 'Attean::API::BlankOrIRIOrTriple';
33 50     50   17905 }
  50         94  
  50         163  
34              
35             use Moo::Role;
36             }
37              
38 50     50   15889 use Moo::Role;
  50         127  
  50         200  
39             }
40              
41             use Scalar::Util qw(blessed);
42 50     50   15405 use Sub::Install;
  50         97  
  50         230  
43             use Sub::Util qw(set_subname);
44              
45             use Moo::Role;
46 50     50   16024  
  50         122  
  50         2351  
47 50     50   20144 with 'Attean::API::SPARQLSerializable';
  50         70323  
  50         238  
48 50     50   2129  
  50         80  
  50         2515  
49             my ($a, $b) = @_;
50 50     50   237 return ($a->as_string eq $b->as_string);
  50         86  
  50         277  
51             }
52              
53             my $self = shift;
54             return (! $self->does('Attean::API::Variable'));
55 283     283 1 385 }
56 283         560
57             my $self = shift;
58             my $class = ref($self);
59             my $bind = shift;
60 0     0 1 0 if ($self->does('Attean::API::Variable')) {
61 0         0 my $name = $self->value;
62             my $replace = $bind->value($name);
63             if (defined($replace) and blessed($replace)) {
64             return $replace;
65 4     4 0 838 } else {
66 4         7 return $self;
67 4         6 }
68 4 100       13 } else {
69 3         44 return $self;
70 3         12 }
71 3 100 66     16 }
72 2         7  
73             BEGIN {
74 1         3 my %types = (
75             variable => 'Variable',
76             blank => 'Blank',
77 1         20 literal => 'Literal',
78             resource => 'IRI',
79             iri => 'IRI',
80             );
81             while (my ($name, $role) = each(%types)) {
82 50     50   28690 my $method = "is_$name";
83             my $code = sub { return shift->does("Attean::API::$role") };
84             Sub::Install::install_sub({
85             code => set_subname($method, $code),
86             as => $method
87             });
88             }
89 50         403 }
90 250         10553 }
91 250     15   709  
  15     15   4467  
        15      
        15      
        15      
92 250         1631 use Scalar::Util qw(blessed);
93             use Sub::Install;
94             use Sub::Util qw(set_subname);
95              
96             use Moo::Role;
97              
98             with 'Attean::API::SPARQLSerializable';
99              
100             my $self = shift;
101 50     50   4732 return (! $self->does('Attean::API::Variable'));
  50         128  
  50         1989  
102 50     50   249 }
  50         102  
  50         248  
103 50     50   2035
  50         144  
  50         2036  
104             my $self = shift;
105 50     50   280 my $class = ref($self);
  50         120  
  50         192  
106             my $bind = shift;
107             if ($self->does('Attean::API::Variable')) {
108             my $name = $self->value;
109             my $replace = $bind->value($name);
110 0     0 0 0 if (defined($replace) and blessed($replace)) {
111 0         0 return $replace;
112             } else {
113             return $self;
114             }
115 0     0 0 0 } else {
116 0         0 return $self;
117 0         0 }
118 0 0       0 }
119 0         0  
120 0         0 BEGIN {
121 0 0 0     0 my %types = (
122 0         0 variable => 'Variable',
123             blank => 'Blank',
124 0         0 literal => 'Literal',
125             resource => 'IRI',
126             iri => 'IRI',
127 0         0 pattern => 'TriplePattern'
128             );
129             while (my ($name, $role) = each(%types)) {
130             my $method = "is_$name";
131             my $code = sub { return shift->does("Attean::API::$role") };
132 50     50   27362 Sub::Install::install_sub({
133             code => set_subname($method, $code),
134             as => $method
135             });
136             }
137             }
138             }
139              
140 50         395 use Moo::Role;
141 300         12449 requires 'map'; # my $that = $object->map($this)
142 300     0   1234 }
  0     0   0  
        0      
        0      
        0      
        0      
143 300         1538  
144             use AtteanX::SPARQL::Constants;
145             use AtteanX::SPARQL::Token;
146              
147             use Moo::Role;
148              
149             with 'Attean::API::TermOrVariable';
150              
151             =item C<< as_string >>
152 50     50   4420  
  50         95  
  50         224  
153             Returns a string representation of the variable.'
154              
155             =cut
156              
157 50     50   36514 my $self = shift;
  50         115  
  50         6321  
158 50     50   18969 return '?' . $self->value;
  50         171  
  50         1989  
159             }
160 50     50   347  
  50         79  
  50         374  
161             my $self = shift;
162             my $t = AtteanX::SPARQL::Token->fast_constructor( VAR, -1, -1, -1, -1, [$self->value] );
163             return Attean::ListIterator->new( values => [$t], item_type => 'AtteanX::SPARQL::Token' );
164             }
165            
166             }
167              
168             use Attean::RDF;
169              
170             use Moo::Role;
171 19     19 1 1808 use namespace::clean;
172 19         110  
173             with 'MooX::Log::Any';
174             requires 'elements';
175              
176 170     170 0 283 my $self = shift;
177 170         936 my ($set) = $self->canonical_set_with_mapping;
178 170         10812 return $set;
179             }
180            
181             my $self = shift;
182             my @t = $self->elements;
183             my @tuples = map { [ $_->tuples_string, $_, {} ] } @t;
184 50     50   44184 my $replacements = 0;
  50         111  
  50         342  
185             foreach my $p (@tuples) {
186 50     50   36893 my ($str, $t) = @$p;
  50         104  
  50         282  
187 50     50   16519 foreach my $pos ($t->variables) {
  50         90  
  50         234  
188             my $term = $t->value($pos);
189             my $tstr = $term->ntriples_string;
190             if ($term->does('Attean::API::Blank') or $term->does('Attean::API::Variable')) {
191             $str =~ s/\Q$tstr\E/~/;
192             $str .= "#$tstr";
193 16     16 0 22 $p->[2]{$pos} = $tstr;
194 16         39 $replacements++;
195 16         50 $p->[0] = $str;
196             }
197             }
198             }
199 20     20 0 30
200 20         58 @tuples = sort { $a->[0] cmp $b->[0] } @tuples;
201 20         38 my $counter = 1;
  32         90  
202 20         43 my %mapping;
203 20         44 foreach my $i (0 .. $#tuples) {
204 32         282 my $p = $tuples[$i];
205 32         67 my ($str, $t) = @$p;
206 104         1409 my $item_class = ref($t);
207 104         1529 my ($next, $last) = ('')x2;
208 104 100 100     754 $last = $tuples[$i-1][0] if ($i > 0);
209 58         1881 $next = $tuples[$i+1][0] if ($i < $#tuples);
210 58         121 next if ($str eq $last or $str eq $next);
211 58         123 foreach my $pos (reverse $t->variables) {
212 58         71 if (defined(my $tstr = $p->[2]{$pos})) {
213 58         113 $tstr =~ /^([?]|_:)([^#]+)$/;
214             my $prefix = $1;
215             my $name = $2;
216             my $key = "$prefix$name";
217             delete $p->[2]{$pos};
218 20         278 my $id = (exists($mapping{$key})) ? $mapping{$key}{id} : sprintf("v%03d", $counter++);
  18         45  
219 20         28 my $type = ($prefix eq '?' ? 'variable' : 'blank');
220 20         34 $mapping{ $key } = { id => $id, prefix => $prefix, type => $type };
221 20         49 my %t = $p->[1]->mapping;
222 32         51 $t{ $pos } = ($type eq 'blank') ? Attean::Blank->new($id) : Attean::Variable->new($id);
223 32         67 my $t = $item_class->new( %t );
224 32         53 $p->[1] = $t;
225 32         60 $p->[0] = $t->tuples_string;
226 32 100       92 }
227 32 100       81 }
228 32 50 33     113 }
229 32         89
230 104 100       233 foreach my $p (@tuples) {
231 58         203 my ($str, $t) = @$p;
232 58         119 my $item_class = ref($t);
233 58         93 foreach my $pos (reverse $t->variables) {
234 58         91 if (defined(my $tstr = $p->[2]{$pos})) {
235 58         108 $tstr =~ /^([?]|_:)([^#]+)$/;
236 58 100       189 my $prefix = $1;
237 58 100       110 my $name = $2;
238 58         209 my $key = "$prefix$name";
239 58         158 delete $p->[2]{$pos};
240 58 100       1094 unless (exists($mapping{$key})) {
241 58         3584 $self->error("Cannot canonicalize binding set");
242 58         1755 return;
243 58         162 }
244             my $id = $mapping{$key}{id};
245             my $type = ($prefix eq '?' ? 'variable' : 'blank');
246             $mapping{ $key } = { id => $id, prefix => $prefix, type => $type };
247             my %t = $p->[1]->mapping;
248 20         46 $t{ $pos } = ($type eq 'blank') ? Attean::Blank->new($id) : Attean::Variable->new($id);
249 32         63 my $t = $item_class->new( %t );
250 32         47 $p->[1] = $t;
251 32         64 $p->[0] = $t->tuples_string;
252 104 50       216 }
253 0         0 }
254 0         0 }
255 0         0  
256 0         0 @tuples = sort { $a->[0] cmp $b->[0] } @tuples;
257 0         0 my $elements = [ map { $_->[1] } @tuples ];
258 0 0       0 return ($elements, \%mapping);
259 0         0 }
260 0         0 }
261              
262 0         0 use Attean::API::Term;
263 0 0       0 use Attean::API::Store;
264 0         0 use Attean::API::Model;
265 0         0 use Attean::API::Iterator;
266 0 0       0 use Attean::API::Parser;
267 0         0 use Attean::API::Serializer;
268 0         0 use Attean::API::Query;
269 0         0 use Attean::API::Expression;
270             use Attean::API::Plan;
271             use Attean::API::QueryPlanner;
272            
273             use Attean::Variable;
274 20         59 use Attean::Blank;
  18         41  
275 20         36 use Attean::IRI;
  32         62  
276 20         83 }
277              
278             1;
279              
280              
281 50     50   104054 =back
  50         194  
  50         2137  
282 50     50   22894  
  50         185  
  50         1962  
283 50     50   21815 =head1 BUGS
  50         201  
  50         2009  
284 50     50   380  
  50         102  
  50         1039  
285 50     50   21938 Please report any bugs or feature requests to through the GitHub web interface
  50         182  
  50         2208  
286 50     50   418 at L<https://github.com/kasei/attean/issues>.
  50         89  
  50         1306  
287 50     50   285  
  50         156  
  50         1080  
288 50     50   21094 =head1 SEE ALSO
  50         170  
  50         2216  
289 50     50   20962  
  50         153  
  50         2073  
290 50     50   20753  
  50         147  
  50         2022  
291              
292 50     50   19077 =head1 AUTHOR
  50         148  
  50         1374  
293 50     50   18471  
  50         162  
  50         1308  
294 50     50   18569 Gregory Todd Williams C<< <gwilliams@cpan.org> >>
  50         151  
  50         2714  
295              
296             =head1 COPYRIGHT
297              
298             Copyright (c) 2014--2022 Gregory Todd Williams.
299             This program is free software; you can redistribute it and/or modify it under
300             the same terms as Perl itself.
301              
302             =cut