File Coverage

blib/lib/WQS/SPARQL/Query/Select.pm
Criterion Covered Total %
statement 45 46 97.8
branch 11 12 91.6
condition n/a
subroutine 7 7 100.0
pod 2 2 100.0
total 65 67 97.0


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