| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 1 | package Krawfish::Koral::Corpus::FieldGroup; |
| Akron | acde0ba | 2017-12-08 14:05:13 +0100 | [diff] [blame] | 2 | use Role::Tiny::With; |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 3 | use Krawfish::Log; |
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 4 | use Krawfish::Koral::Corpus::AndNot; |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 5 | use Krawfish::Koral::Corpus::Anywhere; |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 6 | use Krawfish::Corpus::Or; |
| Akron | 349747d | 2016-12-05 11:05:53 +0100 | [diff] [blame] | 7 | use Krawfish::Corpus::And; |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 8 | use strict; |
| 9 | use warnings; | ||||
| 10 | |||||
| Akron | acde0ba | 2017-12-08 14:05:13 +0100 | [diff] [blame] | 11 | with 'Krawfish::Koral::Util::Boolean'; |
| 12 | with 'Krawfish::Koral::Corpus'; | ||||
| 13 | |||||
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 14 | # TODO: |
| 15 | # Preparation should be: | ||||
| 16 | # -> normalize() | ||||
| 17 | # -> finalize() | ||||
| 18 | # -> memoize(cache) | ||||
| 19 | # -> optimize(index) | ||||
| 20 | |||||
| Akron | 4f9eef4 | 2017-07-24 11:41:09 +0200 | [diff] [blame] | 21 | |
| 22 | # TODO: | ||||
| 23 | # In normalization phase make | ||||
| 24 | # X geq Y & X leq Y -> X eq Y | ||||
| Akron | 965f5d9 | 2017-01-20 18:38:08 +0100 | [diff] [blame] | 25 | |
| Akron | bc7dd43 | 2017-07-18 14:21:51 +0200 | [diff] [blame] | 26 | use constant DEBUG => 0; |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 27 | |
| Akron | 2c6c716 | 2017-05-15 18:15:33 +0200 | [diff] [blame] | 28 | |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 29 | sub new { |
| 30 | my $class = shift; | ||||
| 31 | bless { | ||||
| 32 | operation => shift, | ||||
| 33 | operands => [@_] | ||||
| 34 | }, $class; | ||||
| 35 | }; | ||||
| 36 | |||||
| Akron | 2c6c716 | 2017-05-15 18:15:33 +0200 | [diff] [blame] | 37 | |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 38 | sub type { |
| 39 | 'fieldGroup'; | ||||
| 40 | }; | ||||
| 41 | |||||
| Akron | 2c6c716 | 2017-05-15 18:15:33 +0200 | [diff] [blame] | 42 | |
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 43 | sub operation { |
| Akron | 5b6264f | 2017-07-19 01:14:01 +0200 | [diff] [blame] | 44 | my $self = shift; |
| 45 | if (@_) { | ||||
| 46 | $self->{operation} = shift; | ||||
| 47 | return $self; | ||||
| 48 | }; | ||||
| 49 | $self->{operation}; | ||||
| Akron | 93271d8 | 2016-11-24 09:18:41 +0100 | [diff] [blame] | 50 | }; |
| 51 | |||||
| Akron | 2c6c716 | 2017-05-15 18:15:33 +0200 | [diff] [blame] | 52 | |
| Akron | b945c57 | 2017-07-23 14:55:00 +0200 | [diff] [blame] | 53 | # normalize() is provided by Boolean |
| 54 | |||||
| 55 | # optimize() is provided by Boolean | ||||
| 56 | |||||
| 57 | sub bool_and_query { | ||||
| Akron | 0e782bc | 2017-05-14 14:04:41 +0200 | [diff] [blame] | 58 | my $self = shift; |
| Akron | b945c57 | 2017-07-23 14:55:00 +0200 | [diff] [blame] | 59 | Krawfish::Corpus::And->new( |
| 60 | $_[0], | ||||
| 61 | $_[1] | ||||
| 62 | ); | ||||
| Akron | 0e782bc | 2017-05-14 14:04:41 +0200 | [diff] [blame] | 63 | }; |
| 64 | |||||
| Akron | b945c57 | 2017-07-23 14:55:00 +0200 | [diff] [blame] | 65 | sub bool_or_query { |
| 66 | my $self = shift; | ||||
| 67 | Krawfish::Corpus::Or->new( | ||||
| 68 | $_[0], | ||||
| 69 | $_[1] | ||||
| 70 | ); | ||||
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 71 | }; |
| 72 | |||||
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 73 | #sub is_anywhere { |
| Akron | ce10cb4 | 2017-06-14 01:12:40 +0200 | [diff] [blame] | 74 | # my $self = shift; |
| Akron | 5a5595b | 2017-09-10 13:00:57 +0200 | [diff] [blame] | 75 | # return 0 if $self->is_nowhere; |
| Akron | ce10cb4 | 2017-06-14 01:12:40 +0200 | [diff] [blame] | 76 | # return 1 if @{$self->operands} == 0; |
| 77 | # return 0; | ||||
| 78 | #}; | ||||
| 79 | |||||
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 80 | # Check for classes |
| 81 | sub has_classes { | ||||
| 82 | my $self = shift; | ||||
| 83 | |||||
| 84 | # Check operands for classes | ||||
| 85 | foreach (@{$self->operands}) { | ||||
| 86 | |||||
| 87 | # Has classes | ||||
| 88 | return 1 if $_->has_classes; | ||||
| 89 | }; | ||||
| 90 | return; | ||||
| 91 | }; | ||||
| 92 | |||||
| 93 | |||||
| 94 | # Return koral | ||||
| 95 | sub to_koral_fragment { | ||||
| 96 | my $self = shift; | ||||
| 97 | return { | ||||
| 98 | '@type' => 'koral:fieldGroup', | ||||
| 99 | operation => 'operation:' . $self->operation, | ||||
| 100 | operands => [ map { $_->to_koral_fragment } @{$self->{operands}} ] | ||||
| 101 | }; | ||||
| 102 | }; | ||||
| 103 | |||||
| 104 | |||||
| 105 | sub to_string { | ||||
| Akron | 321d200 | 2017-10-11 19:15:52 +0200 | [diff] [blame] | 106 | my ($self, $id) = @_; |
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 107 | my $op = $self->operation eq 'and' ? '&' : '|'; |
| 108 | |||||
| 109 | my $str = $self->is_negative ? '!(' : ''; | ||||
| 110 | |||||
| 111 | $str .= join($op, map { | ||||
| Akron | c552937 | 2017-06-21 15:56:18 +0200 | [diff] [blame] | 112 | $_ ? ( |
| 113 | $_->type eq 'fieldGroup' ? | ||||
| 114 | ( | ||||
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 115 | $_->is_anywhere ? |
| Akron | c552937 | 2017-06-21 15:56:18 +0200 | [diff] [blame] | 116 | '[1]' : |
| Akron | 321d200 | 2017-10-11 19:15:52 +0200 | [diff] [blame] | 117 | '(' . $_->to_string($id) . ')' |
| Akron | c552937 | 2017-06-21 15:56:18 +0200 | [diff] [blame] | 118 | ) |
| 119 | : | ||||
| Akron | 3d1df33 | 2017-12-23 16:21:21 +0100 | [diff] [blame] | 120 | $_->to_string($id) |
| Akron | c552937 | 2017-06-21 15:56:18 +0200 | [diff] [blame] | 121 | ) : '()' |
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 122 | } @{$self->operands_in_order}); |
| 123 | |||||
| 124 | $str .= $self->is_negative ? ')' : ''; | ||||
| 125 | $str; | ||||
| 126 | }; | ||||
| 127 | |||||
| 128 | |||||
| Akron | acde0ba | 2017-12-08 14:05:13 +0100 | [diff] [blame] | 129 | sub from_koral { |
| 130 | ... | ||||
| 131 | }; | ||||
| 132 | |||||
| 133 | |||||
| Akron | 8a27142 | 2017-06-08 01:58:32 +0200 | [diff] [blame] | 134 | 1; |
| 135 | |||||
| 136 | |||||
| 137 | __END__ | ||||
| Akron | 2ea61aa | 2017-06-03 16:30:23 +0200 | [diff] [blame] | 138 | |