Skip to content

Instantly share code, notes, and snippets.

@havran
Created April 13, 2015 18:36
Show Gist options
  • Save havran/f409b898bb4af3cd0d11 to your computer and use it in GitHub Desktop.
Save havran/f409b898bb4af3cd0d11 to your computer and use it in GitHub Desktop.
# Store CBRFilter objects
#
class CBRFilters
include Enumerable
extend Forwardable
attr_accessor :filters
def_delegators :@filters, :each, :size, :<<, :push
def initialize
@filters ||= []
end
# Compile Elastic Search query (as hash)
def query
query = {
size: 0,
aggs: {}
}
@filters.each do |filter|
query[:aggs].update(filter.query)
end
return query
end
end
# Filter object
#
class CBRFilter
attr_accessor :type, :defaults, :selected
def initialize(opts = {})
opts.each do |key, val|
instance_variable_set("@#{key}", opts[key])
end
end
# Factory: create new filter
def self.create type
begin
name = "CBRFilter" + (type.classify)
name.constantize.new
rescue NameError
raise(NameError, "Filter class #{name} doesn't exist.")
end
end
def query
{}
end
def option_query
query = {
@type.to_sym => {
terms: {
field: @field
}
}
}
end
def min_max_query
query = {
(@type + '_min').to_sym => {
min: {
field: @field
}
},
(@type + '_max').to_sym => {
max: {
field: @field
},
}
}
end
end
# Date range filter
#
class CBRFilterDateRange < CBRFilter
def initialize
super :type => 'date_range',
:defaults => nil,
:selected => nil,
:field => 'timestamp'
end
def query
min_max_query
end
end
# PFI filter
#
class CBRFilterPfi < CBRFilter
def initialize
super :type => 'pfi',
:defaults => nil,
:selected => nil,
:field => 'pfi'
end
def query
option_query
end
end
# Typ DO filter
#
class CBRFilterTypDo < CBRFilter
def initialize
super :type => 'typ_do',
:defaults => nil,
:selected => nil,
:field => 'typ_do'
end
def query
option_query
end
end
### usage
filters = CBRFilters.new
filters << CBRFilter.create('date_range')
filters << CBRFilter.create('pfi')
filters << CBRFilter.create('typ_do')
puts filters.query.to_json
# output:
# {"size":0,"aggs":{"date_range_min":{"min":{"field":"timestamp"}},"date_range_max":{"max":{"field":"timestamp"}},"pfi":{"terms":{"field":"pfi"}},"typ_do":{"terms":{"field":"typ_do"}}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment