blob: 7673d61667c2e23167e7528ef5ef27b56aabeadd [file] [log] [blame]
Akron0a0e9242016-10-28 14:42:29 +02001package Krawfish::Koral::Query;
Akron6621e112016-11-05 17:21:39 +01002use parent 'Krawfish::Info';
Akron4763ea62016-11-02 19:36:18 +01003use Krawfish::Koral::Query::Builder;
Akron0a0e9242016-10-28 14:42:29 +02004use strict;
5use warnings;
6
Akron33f1dcb2016-10-29 17:27:23 +02007sub new {
8 my $class = shift;
Akron4763ea62016-11-02 19:36:18 +01009 bless {
10 any => 0,
11 optional => 0,
12 null => 0,
13 negative => 0,
14 extended => 0,
Akronddf077a2016-11-05 15:00:00 +010015 extended_left => 0,
Akron6621e112016-11-05 17:21:39 +010016 extended_right => 0
Akron4763ea62016-11-02 19:36:18 +010017 }, $class;
Akron33f1dcb2016-10-29 17:27:23 +020018};
19
Akron4763ea62016-11-02 19:36:18 +010020#########################################
21# Query Planning methods and attributes #
22#########################################
Akrona211bf52016-10-29 18:03:29 +020023
Akron4763ea62016-11-02 19:36:18 +010024# Prepare a query for an index
25sub prepare_for {
26 my ($self, $index) = @_;
Akronc3657bf2016-10-31 00:15:43 +010027
Akron4763ea62016-11-02 19:36:18 +010028 my $query = $self;
29
30 # There is a possible 'any' extension,
31 # that may exceed the text
32 if ($self->is_extended_right) {
33 my $builder = $self->builder;
34
35 # Wrap query in a text element
36 $query = $builder->position(
37 ['endsWith', 'isAround', 'startsWith', 'matches'],
38 $builder->span('base/s=t'),
39 $self
40 );
41 };
42
43 # Return the planned query
44 # TODO: Check for serialization errors
45 $query->plan_for($index);
46};
47
48# Plan a query for an index (to be overwritten)
49sub plan_for;
50
Akrondc9f1162016-11-05 15:31:40 +010051sub is_any { $_[0]->{any} // 0 };
52sub is_optional { $_[0]->{optional} // 0 };
53sub is_null { $_[0]->{null} // 0 };
54sub is_negative { $_[0]->{negative} // 0 };
Akrondc9f1162016-11-05 15:31:40 +010055sub is_extended_right { $_[0]->{extended_right} // 0 };
56sub is_extended_left { $_[0]->{extended_left} // 0 };
Akron84b8b752016-11-19 15:55:12 +010057sub is_extended { $_[0]->is_extended_right || $_[0]->is_extended_left // 0 };
Akron4763ea62016-11-02 19:36:18 +010058sub freq { -1 };
Akron774c5db2016-11-09 16:11:38 +010059sub type { '' };
Akrona211bf52016-10-29 18:03:29 +020060
Akron774c5db2016-11-09 16:11:38 +010061# TODO: Probably better to be renamed "potential_anchor"
Akrona211bf52016-10-29 18:03:29 +020062sub maybe_anchor {
63 my $self = shift;
64 return if $self->is_negative;
65 return if $self->is_optional;
66 return if $self->is_any;
67 return 1;
68};
69
70# Check if the wrapped query may need to be sorted
71# on focussing on a specific class.
72# Normally spans are always sorted, but in case of
73# a wrapped relation query, classed operands may
74# be in arbitrary order. When focussing on these
75# classes, the span has to me reordered.
76
77sub maybe_unsorted { ... };
78
79#############################
80# Query Application methods #
81#############################
Akron33f1dcb2016-10-29 17:27:23 +020082
Akrona211bf52016-10-29 18:03:29 +020083# Deserialization of KoralQuery
Akron33f1dcb2016-10-29 17:27:23 +020084sub from_koral {
85 ...
86};
87
Akrona211bf52016-10-29 18:03:29 +020088# Overwritten
89sub to_koral_fragment;
90
Akronc3657bf2016-10-31 00:15:43 +010091# Overwritten
Akrona211bf52016-10-29 18:03:29 +020092sub to_string;
Akron33f1dcb2016-10-29 17:27:23 +020093
Akron573e7ec2016-11-05 19:03:01 +010094# Clone the query
95# sub clone;
Akronc3657bf2016-10-31 00:15:43 +010096
Akron4763ea62016-11-02 19:36:18 +010097# Create KoralQuery builder
98sub builder {
99 return Krawfish::Koral::Query::Builder->new;
100};
101
Akron0a0e9242016-10-28 14:42:29 +02001021;
Akron33f1dcb2016-10-29 17:27:23 +0200103
Akrona211bf52016-10-29 18:03:29 +0200104
Akron33f1dcb2016-10-29 17:27:23 +0200105__END__
106