File Coverage

blib/lib/WQS/SPARQL/Query/Select.pm
Criterion Covered Total %
statement 49 49 100.0
branch 10 10 100.0
condition n/a
subroutine 7 7 100.0
pod 2 2 100.0
total 68 68 100.0


line stmt bran cond sub pod time code
1             package WQS::SPARQL::Query::Select;
2              
3 4     4   597321 use strict;
  4         8  
  4         166  
4 4     4   63 use warnings;
  4         11  
  4         310  
5              
6 4     4   2236 use Class::Utils qw(set_params);
  4         57825  
  4         118  
7 4     4   393 use Error::Pure qw(err);
  4         2244  
  4         4077  
8              
9             our $VERSION = 0.03;
10              
11             sub new {
12 3     3 1 396698 my ($class, @params) = @_;
13              
14             # Create object.
15 3         10 my $self = bless {}, $class;
16              
17             # Process parameters.
18 3         19 set_params($self, @params);
19              
20 3         35 return $self;
21             }
22              
23             sub select_value {
24 8     8 1 5341 my ($self, $property_pairs_hr, $filter_ar) = @_;
25              
26 8         17 my %sort;
27 8         11 foreach my $property (keys %{$property_pairs_hr}) {
  8         30  
28 12 100       78 if ($property !~ m/^P(\d+)(\/P\d+\*?)?$/ms) {
29 1         8 err "Bad property '$property'.";
30             }
31 11         44 $sort{$property} = $1;
32             }
33              
34 7         14 my $sparql = "SELECT ?item WHERE {\n";
35 7         13 foreach my $property (sort { $sort{$a} <=> $sort{$b} } keys %{$property_pairs_hr}) {
  4         19  
  7         29  
36 11         27 my $property_wdt = $self->_property($property);
37              
38 11         23 my $value = $property_pairs_hr->{$property};
39 11 100       67 if ($value =~ m/^Q\d+$/ms) {
    100          
    100          
40 5         49 $value = "wd:$value";
41             } elsif ($value =~ m/^\?/ms) {
42             # same
43             } elsif ($value =~ m/^(.*?)(@\w\w)$/ms) {
44 2         8 my ($main_value, $lang) = ($1, $2);
45 2         8 $main_value =~ s/'/\\'/msg;
46 2         5 $value = "'$main_value'$lang";
47             } else {
48 3         9 $value =~ s/'/\\'/msg;
49 3         6 $value = "'$value'";
50             }
51              
52 11         32 $sparql .= " ?item $property_wdt $value.\n"
53             }
54 7         15 foreach my $filter_item_ar (@{$filter_ar}) {
  7         17  
55 1         12 $sparql .= ' FILTER('.$filter_item_ar->[0].' '.$filter_item_ar->[1].' '.$filter_item_ar->[2].')'."\n";
56             }
57 7         14 $sparql .= "}\n";
58              
59 7         28 return $sparql;
60             }
61              
62             sub _property {
63 11     11   22 my ($self, $property_key) = @_;
64              
65 11         29 my $property_wdt;
66 11 100       46 if ($property_key =~ m/^P\d+$/ms) {
67 10         19 $property_wdt = 'wdt:'.$property_key;
68             } else {
69 1         7 my ($p1, $p2) = ($property_key =~ m/^(P\d+)\/(P\d+\*?)$/ms);
70 1         3 $property_wdt = 'wdt:'.$p1.'/wdt:'.$p2;
71             }
72              
73 11         55 return $property_wdt;
74             }
75              
76             1;
77              
78             __END__