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         138  
2 50     50   220 use warnings;
  50         93  
  50         2156  
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   21225 }
  50         622961  
  50         256  
30              
31             use Moo::Role;
32             with 'Attean::API::Term', 'Attean::API::BlankOrIRIOrTriple';
33 50     50   17776 }
  50         90  
  50         169  
34              
35             use Moo::Role;
36             }
37              
38 50     50   15998 use Moo::Role;
  50         120  
  50         191  
39             }
40              
41             use Scalar::Util qw(blessed);
42 50     50   15406 use Sub::Install;
  50         126  
  50         211  
43             use Sub::Util qw(set_subname);
44              
45             use Moo::Role;
46 50     50   16073  
  50         116  
  50         2341  
47 50     50   20901 with 'Attean::API::SPARQLSerializable';
  50         71109  
  50         205  
48 50     50   2108  
  50         96  
  50         2593  
49             my ($a, $b) = @_;
50 50     50   281 return ($a->as_string eq $b->as_string);
  50         89  
  50         270  
51             }
52              
53             my $self = shift;
54             return (! $self->does('Attean::API::Variable'));
55 244     244 1 376 }
56 244         553
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 1260 } else {
66 4         8 return $self;
67 4         7 }
68 4 100       24 } else {
69 3         61 return $self;
70 3         10 }
71 3 100 66     20 }
72 2         6  
73             BEGIN {
74 1         3 my %types = (
75             variable => 'Variable',
76             blank => 'Blank',
77 1         30 literal => 'Literal',
78             resource => 'IRI',
79             iri => 'IRI',
80             );
81             while (my ($name, $role) = each(%types)) {
82 50     50   28816 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         361 }
90 250         10281 }
91 250     15   681  
  15     15   5358  
        15      
        15      
        15      
92 250         1639 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   4739 return (! $self->does('Attean::API::Variable'));
  50         115  
  50         2063  
102 50     50   257 }
  50         119  
  50         217  
103 50     50   1986
  50         104  
  50         2080  
104             my $self = shift;
105 50     50   286 my $class = ref($self);
  50         143  
  50         209  
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   26191 Sub::Install::install_sub({
133             code => set_subname($method, $code),
134             as => $method
135             });
136             }
137             }
138             }
139              
140 50         399 use Moo::Role;
141 300         12185 requires 'map'; # my $that = $object->map($this)
142 300     0   1240 }
  0     0   0  
        0      
        0      
        0      
        0      
143 300         1598  
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   4380  
  50         91  
  50         194  
153             Returns a string representation of the variable.'
154              
155             =cut
156              
157 50     50   36977 my $self = shift;
  50         109  
  50         6354  
158 50     50   18192 return '?' . $self->value;
  50         169  
  50         1939  
159             }
160 50     50   335  
  50         92  
  50         341  
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 1726 use namespace::clean;
172 19         89  
173             with 'MooX::Log::Any';
174             requires 'elements';
175              
176 170     170 0 255 my $self = shift;
177 170         761 my ($set) = $self->canonical_set_with_mapping;
178 170         10008 return $set;
179             }
180            
181             my $self = shift;
182             my @t = $self->elements;
183             my @tuples = map { [ $_->tuples_string, $_, {} ] } @t;
184 50     50   45041 my $replacements = 0;
  50         108  
  50         338  
185             foreach my $p (@tuples) {
186 50     50   37018 my ($str, $t) = @$p;
  50         95  
  50         322  
187 50     50   16060 foreach my $pos ($t->variables) {
  50         99  
  50         204  
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 27 $p->[2]{$pos} = $tstr;
194 16         31 $replacements++;
195 16         54 $p->[0] = $str;
196             }
197             }
198             }
199 20     20 0 34
200 20         68 @tuples = sort { $a->[0] cmp $b->[0] } @tuples;
201 20         39 my $counter = 1;
  32         79  
202 20         40 my %mapping;
203 20         36 foreach my $i (0 .. $#tuples) {
204 32         295 my $p = $tuples[$i];
205 32         68 my ($str, $t) = @$p;
206 104         1385 my $item_class = ref($t);
207 104         1518 my ($next, $last) = ('')x2;
208 104 100 100     691 $last = $tuples[$i-1][0] if ($i > 0);
209 58         1773 $next = $tuples[$i+1][0] if ($i < $#tuples);
210 58         128 next if ($str eq $last or $str eq $next);
211 58         113 foreach my $pos (reverse $t->variables) {
212 58         65 if (defined(my $tstr = $p->[2]{$pos})) {
213 58         118 $tstr =~ /^([?]|_:)([^#]+)$/;
214             my $prefix = $1;
215             my $name = $2;
216             my $key = "$prefix$name";
217             delete $p->[2]{$pos};
218 20         260 my $id = (exists($mapping{$key})) ? $mapping{$key}{id} : sprintf("v%03d", $counter++);
  18         38  
219 20         31 my $type = ($prefix eq '?' ? 'variable' : 'blank');
220 20         23 $mapping{ $key } = { id => $id, prefix => $prefix, type => $type };
221 20         53 my %t = $p->[1]->mapping;
222 32         45 $t{ $pos } = ($type eq 'blank') ? Attean::Blank->new($id) : Attean::Variable->new($id);
223 32         60 my $t = $item_class->new( %t );
224 32         49 $p->[1] = $t;
225 32         88 $p->[0] = $t->tuples_string;
226 32 100       74 }
227 32 100       71 }
228 32 50 33     109 }
229 32         71
230 104 100       240 foreach my $p (@tuples) {
231 58         189 my ($str, $t) = @$p;
232 58         100 my $item_class = ref($t);
233 58         91 foreach my $pos (reverse $t->variables) {
234 58         82 if (defined(my $tstr = $p->[2]{$pos})) {
235 58         101 $tstr =~ /^([?]|_:)([^#]+)$/;
236 58 100       186 my $prefix = $1;
237 58 100       106 my $name = $2;
238 58         185 my $key = "$prefix$name";
239 58         141 delete $p->[2]{$pos};
240 58 100       992 unless (exists($mapping{$key})) {
241 58         3276 $self->error("Cannot canonicalize binding set");
242 58         1655 return;
243 58         120 }
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         42 $t{ $pos } = ($type eq 'blank') ? Attean::Blank->new($id) : Attean::Variable->new($id);
249 32         57 my $t = $item_class->new( %t );
250 32         42 $p->[1] = $t;
251 32         58 $p->[0] = $t->tuples_string;
252 104 50       199 }
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         46 use Attean::Blank;
  18         35  
275 20         33 use Attean::IRI;
  32         57  
276 20         72 }
277              
278             1;
279              
280              
281 50     50   104409 =back
  50         184  
  50         2293  
282 50     50   23568  
  50         163  
  50         2059  
283 50     50   23112 =head1 BUGS
  50         190  
  50         2001  
284 50     50   387  
  50         100  
  50         1119  
285 50     50   22551 Please report any bugs or feature requests to through the GitHub web interface
  50         188  
  50         2167  
286 50     50   406 at L<https://github.com/kasei/attean/issues>.
  50         89  
  50         1339  
287 50     50   289  
  50         99  
  50         1049  
288 50     50   21818 =head1 SEE ALSO
  50         161  
  50         2112  
289 50     50   22313  
  50         151  
  50         2050  
290 50     50   22082  
  50         149  
  50         1935  
291              
292 50     50   19502 =head1 AUTHOR
  50         148  
  50         1350  
293 50     50   19343  
  50         157  
  50         1399  
294 50     50   19457 Gregory Todd Williams C<< <gwilliams@cpan.org> >>
  50         150  
  50         2716  
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