Sha256: 0694fefe23cf1272cc8ca6e064906c3b05040cc6f9cfc6337fce520d06414178
Contents?: true
Size: 1.83 KB
Versions: 1
Compression:
Stored size: 1.83 KB
Contents
require 'sequel' require 'sqlite3' DB = Sequel.sqlite if ENV['LOG_TO_STDOUT'] require 'logger' DB.loggers << Logger.new(STDOUT) end DB.create_table :categories do primary_key :id String :name, null: false, unique: true end DB.create_table :tasks do foreign_key :category_id, :categories String :name, null: false, unique: true Integer :priority, null: false Date :due_date, null: false end class Category < Sequel::Model # :nodoc: one_to_many :tasks end class Task < Sequel::Model # :nodoc: many_to_one :category end class CategoryParser # :nodoc: def call(token) if token.modifier == 'cat' [:where, { Sequel.qualify('category', 'name') => token.term }] end end end class TaskSearch < SearchLingo::AbstractSearch # :nodoc: parser CategoryParser.new # Match categories with priority less than or greater than a given value. # # <2 => Categories with priority < 2 # >5 => Categories with priority > 5 parser do |token| token.match /\A([<>])([[:digit:]]+)\z/ do |m| [:where, Sequel.expr { priority.send m[1], m[2] }] end end # Match tasks with a given due_date. # # 7/4/1776 => Tasks with due_date == Date.new(1776, 7, 4) # 7/4/17 => Tasks with due_date == Date.new(2017, 7, 4) parser do |token| token.match %r{\A(?<m>\d{1,2})/(?<d>\d{1,2})/(?<y>\d{2}\d{2}?)\z} do |m| begin [:where, { due_date: Date.parse("#{m[:y]}/#{m[:m]}/#{m[:d]}") }] rescue ArgumentError end end end # Match tasks with names that contain a given term. # # pay bills => Match tasks with names like "pay bills", "pay bills by today" # brush teeth => Match tasks with names like "brush teeth", "brush teeth and floss" def default_parse(token) [:where, Sequel.lit('tasks.name LIKE ?', "%#{token.term}%")] end def scope @scope.eager_graph(:category) end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
search_lingo-1.0.3 | examples/sequel_example.rb |