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   488 use v5.14;
  50         132  
2 50     50   239 use warnings;
  50         83  
  50         2045  
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.033
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   20581 }
  50         588262  
  50         257  
30              
31             use Moo::Role;
32             with 'Attean::API::Term', 'Attean::API::BlankOrIRIOrTriple';
33 50     50   16710 }
  50         91  
  50         165  
34              
35             use Moo::Role;
36             }
37              
38 50     50   15466 use Moo::Role;
  50         126  
  50         189  
39             }
40              
41             use Scalar::Util qw(blessed);
42 50     50   15182 use Sub::Install;
  50         91  
  50         187  
43             use Sub::Util qw(set_subname);
44              
45             use Moo::Role;
46 50     50   15331  
  50         99  
  50         2195  
47 50     50   19307 with 'Attean::API::SPARQLSerializable';
  50         67283  
  50         200  
48 50     50   1978  
  50         87  
  50         2347  
49             my ($a, $b) = @_;
50 50     50   245 return ($a->as_string eq $b->as_string);
  50         90  
  50         275  
51             }
52              
53             my $self = shift;
54             return (! $self->does('Attean::API::Variable'));
55 283     283 1 365 }
56 283         524
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 1009 } else {
66 4         8 return $self;
67 4         6 }
68 4 100       14 } else {
69 3         52 return $self;
70 3         12 }
71 3 100 66     17 }
72 2         7  
73             BEGIN {
74 1         3 my %types = (
75             variable => 'Variable',
76             blank => 'Blank',
77 1         25 literal => 'Literal',
78             resource => 'IRI',
79             iri => 'IRI',
80             );
81             while (my ($name, $role) = each(%types)) {
82 50     50   27445 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         334 }
90 250         10390 }
91 250     15   633  
  15     15   5153  
        15      
        15      
        15      
92 250         1506 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   4560 return (! $self->does('Attean::API::Variable'));
  50         103  
  50         1922  
102 50     50   262 }
  50         96  
  50         190  
103 50     50   1907
  50         108  
  50         1994  
104             my $self = shift;
105 50     50   303 my $class = ref($self);
  50         90  
  50         199  
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   25440 Sub::Install::install_sub({
133             code => set_subname($method, $code),
134             as => $method
135             });
136             }
137             }
138             }
139              
140 50         364 use Moo::Role;
141 300         11559 requires 'map'; # my $that = $object->map($this)
142 300     0   1193 }
  0     0   0  
        0      
        0      
        0      
        0      
143 300         1461  
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   4201  
  50         115  
  50         170  
153             Returns a string representation of the variable.'
154              
155             =cut
156              
157 50     50   35061 my $self = shift;
  50         100  
  50         5945  
158 50     50   17605 return '?' . $self->value;
  50         154  
  50         1900  
159             }
160 50     50   334  
  50         81  
  50         316  
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 1553 use namespace::clean;
172 19         85  
173             with 'MooX::Log::Any';
174             requires 'elements';
175              
176 170     170 0 220 my $self = shift;
177 170         612 my ($set) = $self->canonical_set_with_mapping;
178 170         8185 return $set;
179             }
180            
181             my $self = shift;
182             my @t = $self->elements;
183             my @tuples = map { [ $_->tuples_string, $_, {} ] } @t;
184 50     50   43559 my $replacements = 0;
  50         100  
  50         343  
185             foreach my $p (@tuples) {
186 50     50   35442 my ($str, $t) = @$p;
  50         89  
  50         307  
187 50     50   15472 foreach my $pos ($t->variables) {
  50         86  
  50         212  
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 26 $p->[2]{$pos} = $tstr;
194 16         32 $replacements++;
195 16         48 $p->[0] = $str;
196             }
197             }
198             }
199 20     20 0 25
200 20         62 @tuples = sort { $a->[0] cmp $b->[0] } @tuples;
201 20         28 my $counter = 1;
  32         72  
202 20         30 my %mapping;
203 20         29 foreach my $i (0 .. $#tuples) {
204 32         243 my $p = $tuples[$i];
205 32         58 my ($str, $t) = @$p;
206 104         1254 my $item_class = ref($t);
207 104         1360 my ($next, $last) = ('')x2;
208 104 100 100     599 $last = $tuples[$i-1][0] if ($i > 0);
209 58         1693 $next = $tuples[$i+1][0] if ($i < $#tuples);
210 58         101 next if ($str eq $last or $str eq $next);
211 58         98 foreach my $pos (reverse $t->variables) {
212 58         73 if (defined(my $tstr = $p->[2]{$pos})) {
213 58         103 $tstr =~ /^([?]|_:)([^#]+)$/;
214             my $prefix = $1;
215             my $name = $2;
216             my $key = "$prefix$name";
217             delete $p->[2]{$pos};
218 20         206 my $id = (exists($mapping{$key})) ? $mapping{$key}{id} : sprintf("v%03d", $counter++);
  18         36  
219 20         26 my $type = ($prefix eq '?' ? 'variable' : 'blank');
220 20         23 $mapping{ $key } = { id => $id, prefix => $prefix, type => $type };
221 20         45 my %t = $p->[1]->mapping;
222 32         50 $t{ $pos } = ($type eq 'blank') ? Attean::Blank->new($id) : Attean::Variable->new($id);
223 32         51 my $t = $item_class->new( %t );
224 32         41 $p->[1] = $t;
225 32         59 $p->[0] = $t->tuples_string;
226 32 100       75 }
227 32 100       63 }
228 32 50 33     94 }
229 32         65
230 104 100       186 foreach my $p (@tuples) {
231 58         200 my ($str, $t) = @$p;
232 58         102 my $item_class = ref($t);
233 58         75 foreach my $pos (reverse $t->variables) {
234 58         68 if (defined(my $tstr = $p->[2]{$pos})) {
235 58         90 $tstr =~ /^([?]|_:)([^#]+)$/;
236 58 100       159 my $prefix = $1;
237 58 100       84 my $name = $2;
238 58         177 my $key = "$prefix$name";
239 58         129 delete $p->[2]{$pos};
240 58 100       922 unless (exists($mapping{$key})) {
241 58         3064 $self->error("Cannot canonicalize binding set");
242 58         1523 return;
243 58         117 }
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         33 $t{ $pos } = ($type eq 'blank') ? Attean::Blank->new($id) : Attean::Variable->new($id);
249 32         49 my $t = $item_class->new( %t );
250 32         40 $p->[1] = $t;
251 32         55 $p->[0] = $t->tuples_string;
252 104 50       167 }
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         45 use Attean::Blank;
  18         28  
275 20         35 use Attean::IRI;
  32         63  
276 20         65 }
277              
278             1;
279              
280              
281 50     50   100993 =back
  50         182  
  50         2496  
282 50     50   23440  
  50         172  
  50         2338  
283 50     50   23501 =head1 BUGS
  50         178  
  50         2258  
284 50     50   387  
  50         88  
  50         1022  
285 50     50   22505 Please report any bugs or feature requests to through the GitHub web interface
  50         155  
  50         2416  
286 50     50   429 at L<https://github.com/kasei/attean/issues>.
  50         86  
  50         1393  
287 50     50   263  
  50         80  
  50         1024  
288 50     50   21987 =head1 SEE ALSO
  50         173  
  50         2373  
289 50     50   22392  
  50         157  
  50         2062  
290 50     50   21229  
  50         155  
  50         2086  
291              
292 50     50   20448 =head1 AUTHOR
  50         156  
  50         1392  
293 50     50   20076  
  50         144  
  50         1384  
294 50     50   20360 Gregory Todd Williams C<< <gwilliams@cpan.org> >>
  50         159  
  50         2838  
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