diff options
author | mms <git@sapka.me> | 2024-11-07 22:31:31 +0100 |
---|---|---|
committer | mms <git@sapka.me> | 2024-11-07 22:31:31 +0100 |
commit | eb327b3b8ccde4f0a682a0167af8fc4ab89d3958 (patch) | |
tree | f044a1093ad9528bb27f6aa2297db6e3cd0fa603 /lib | |
parent | a8d3a3d70e6e69ae5c98b7066c62d9dc9625907c (diff) |
feat: basic filters
Diffstat (limited to 'lib')
-rw-r--r-- | lib/some.rb | 4 | ||||
l--------- | lib/some/.#messages.rb | 1 | ||||
-rw-r--r-- | lib/some/messages.rb | 46 |
3 files changed, 39 insertions, 12 deletions
diff --git a/lib/some.rb b/lib/some.rb index 7e1dbdb..9a802dd 100644 --- a/lib/some.rb +++ b/lib/some.rb @@ -30,5 +30,5 @@ end p Some::Messages.new .filter(from: 'janek', tags: [1, 2]) - .or.filter(subject: 'a') - .query_string + .or.filter(subject: 'a') + .query_string diff --git a/lib/some/.#messages.rb b/lib/some/.#messages.rb deleted file mode 120000 index b1e8e06..0000000 --- a/lib/some/.#messages.rb +++ /dev/null @@ -1 +0,0 @@ -mms@voyager.local.90786:1730615032
\ No newline at end of file diff --git a/lib/some/messages.rb b/lib/some/messages.rb index 2f89d2b..78c36a3 100644 --- a/lib/some/messages.rb +++ b/lib/some/messages.rb @@ -6,11 +6,21 @@ module Some OR_CONJUCTION = :or DEFAULT_CONJUCTION = AND_CONJUCTION - attr_reader :query, :current_conjuction + Token = Struct.new(:id, :conjuction, :field, :value) do + def to_query + conjuction_to_use = id > 1 ? conjuction : '' + return unless field == :direct + + "#{conjuction_to_use} (#{value})" + end + end + + attr_accessor :query, :current_conjuction, :token_count def initialize @query = [] @current_conjuction = AND_CONJUCTION + @token_count = 0 end def or @@ -18,22 +28,40 @@ module Some self end + def and + @current_conjuction = AND_CONJUCTION + self + end + def filter(params) - query << params.map do |key, value| - unless value.is_a? Array - [current_conjuction, key, value.to_sym] - else - - [current_conjuction, - value.map { |subarg| [OR_CONJUCTION, key, subarg] }] - end + case params + when String + add_filter_from_string(params) end + # query << params.map do |key, value| + # unless value.is_a? Array + # [current_conjuction, key, value.to_sym] + # else + # + # [current_conjuction, + # value.map { |subarg| [OR_CONJUCTION, key, subarg] }] + # end + # end + # self end + def add_filter_from_string(string) + @query << Token.new(next_token_id, current_conjuction, :direct, string) + end + def query_string + query.map(&:to_query).join(' ') + end + def next_token_id + @token_count += 1 end end end |