Catmandu-Store-MongoDB
view release on metacpan or search on metacpan
lib/Catmandu/Store/MongoDB/CQL.pm view on Meta::CPAN
my $search_clause;
if ($base eq 'scr') {
if ($self->mapping && $self->mapping->{default_relation}) {
$base = $self->mapping->{default_relation};
}
else {
$base = '=';
}
}
#fields to search for
if ($qualifier =~ $any_field) {
#set default field explicitely
if ($self->mapping && $self->mapping->{default_index}) {
$search_field = $self->mapping->{default_index};
}
else {
$search_field = '_all';
}
}
else {
$search_field = $qualifier;
#change search field
$search_field =~ s/(?<=[^_])_(?=[^_])//g
if $self->mapping
&& $self->mapping->{strip_separating_underscores};
my $q_mapping = $indexes->{$search_field}
or confess "cql error: unknown index $search_field";
$q_mapping->{op}->{$base}
or confess "cql error: relation $base not allowed";
my $op = $q_mapping->{op}->{$base};
if (ref $op && $op->{field}) {
$search_field = $op->{field};
}
elsif ($q_mapping->{field}) {
$search_field = $q_mapping->{field};
}
#change term using filters
my $filters;
if (ref $op && $op->{filter}) {
$filters = $op->{filter};
}
elsif ($q_mapping->{filter}) {
$filters = $q_mapping->{filter};
}
if ($filters) {
for my $filter (@$filters) {
if ($filter eq 'lowercase') {
$term = lc $term;
}
}
}
#change term using callbacks
if (ref $op && $op->{cb}) {
my ($pkg, $sub) = @{$op->{cb}};
$term = require_package($pkg)->$sub($term);
}
elsif ($q_mapping->{cb}) {
my ($pkg, $sub) = @{$q_mapping->{cb}};
$term = require_package($pkg)->$sub($term);
}
}
#field search
my $unmasked
= array_includes([map {$_->[1]} @modifiers], "cql.unmasked");
# trick to force numeric values interpreted as integers
$term = $term + 0 if ($term =~ /^[1-9]\d*$/);
if ($base eq '=' or $base eq 'scr') {
unless ($unmasked) {
$term
= _is_wildcard($term) ? _wildcard_to_regex($term) : $term;
}
$search_clause = +{$search_field => $term};
}
elsif ($base eq '<') {
$search_clause = +{$search_field => {'$lt' => $term}};
}
elsif ($base eq '>') {
$search_clause = +{$search_field => {'$gt' => $term}};
}
elsif ($base eq '<=') {
$search_clause = +{$search_field => {'$lte' => $term}};
}
elsif ($base eq '>=') {
$search_clause = +{$search_field => {'$gte' => $term}};
}
elsif ($base eq '<>') {
$search_clause = +{$search_field => {'$ne' => $term}};
}
elsif ($base eq 'exact') {
$search_clause = +{$search_field => $term};
}
elsif ($base eq 'all') {
my @terms = split /\s+/, $term;
#query $all in mongo means exact matching, so we always need regular expressions here
for (my $i = 0; $i < scalar(@terms); $i++) {
my $term = $terms[$i];
if ($unmasked) {
$term = _quote_wildcard($term);
$term = qr($term);
}
elsif (_is_wildcard($term)) {
$term = _wildcard_to_regex($term);
( run in 0.896 second using v1.01-cache-2.11-cpan-39bf76dae61 )