Module: ElasticsearchRecord::Querying::ClassMethods
- Defined in:
- lib/elasticsearch_record/querying.rb
Constant Summary collapse
- ES_QUERYING_METHODS =
define additional METHODS to be delegated to the Relation
[ :query, :filter, :must, :must_not, :should, :aggregate, :msearch ].freeze
Instance Method Summary collapse
-
#_query_by_msearch(queries, async: false) ⇒ Object
execute query by msearch.
-
#esql(esql) ⇒ Object
executes a
esqlby provided ES|SL query Does NOT instantiate records. -
#find_by_esql(esql, &block) ⇒ Object
ES|QL query API Returns search results for an ES|QL (Elasticsearch query language) query.
-
#find_by_id(id) ⇒ Object
finds a single record by provided id.
-
#find_by_query(arguments, &block) ⇒ Object
finds records by query arguments.
-
#find_by_sql(sql, binds = [], preparable: nil, &block) ⇒ Object
finds records by sql, query-arguments or query-object.
-
#msearch(queries) ⇒ Object
executes a
msearchby provided RAW queries. -
#search(*args, &block) ⇒ Object
executes a search by provided
RAWquery - supportsElasticsearch::DSLgem if loaded.
Instance Method Details
#_query_by_msearch(queries, async: false) ⇒ Object
execute query by msearch
142 143 144 |
# File 'lib/elasticsearch_record/querying.rb', line 142 def _query_by_msearch(queries, async: false) connection.select_multiple(queries, "#{name} Msearch", async: async) end |
#esql(esql) ⇒ Object
executes a esql by provided ES|SL query
Does NOT instantiate records.
99 100 101 102 103 104 105 106 107 108 |
# File 'lib/elasticsearch_record/querying.rb', line 99 def esql(esql) # build new query query = ElasticsearchRecord::Query.new( type: ElasticsearchRecord::Query::TYPE_ESQL, body: { query: esql }, # IMPORTANT: Always provide all columns columns: source_column_names) connection.exec_query(query, "#{name} ES|QL") end |
#find_by_esql(esql, &block) ⇒ Object
ES|QL query API Returns search results for an ES|QL (Elasticsearch query language) query.
85 86 87 88 89 90 91 92 93 94 |
# File 'lib/elasticsearch_record/querying.rb', line 85 def find_by_esql(esql, &block) # build new query query = ElasticsearchRecord::Query.new( type: ElasticsearchRecord::Query::TYPE_ESQL, body: { query: esql }, # IMPORTANT: Always provide all columns columns: source_column_names) _load_from_sql(_query_by_sql(query), &block) end |
#find_by_id(id) ⇒ Object
finds a single record by provided id. This method is overwritten to support the primary key column (+_id+).
24 25 26 |
# File 'lib/elasticsearch_record/querying.rb', line 24 def find_by_id(id) has_attribute?('id') ? super(id) : public_send(:find_by__id, id) end |
#find_by_query(arguments, &block) ⇒ Object
finds records by query arguments
68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/elasticsearch_record/querying.rb', line 68 def find_by_query(arguments, &block) # build new query query = ElasticsearchRecord::Query.new( index: table_name, type: ElasticsearchRecord::Query::TYPE_SEARCH, arguments: arguments, # IMPORTANT: Always provide all columns to prevent unknown attributes that should be nil ... columns: source_column_names) _load_from_sql(_query_by_sql(query), &block) end |
#find_by_sql(sql, binds = [], preparable: nil, &block) ⇒ Object
finds records by sql, query-arguments or query-object.
PLEASE NOTE: This method is used by different other methods:
- ActiveRecord::Relation#exec_queries
- ActiveRecord::StatementCache#execute
-
We cannot rewrite all call-sources since this will mess up the whole logic end will end in other problems. So we check here what kind of query is provided and decide what to do.
PLEASE NOTE: since ths is also used by ActiveRecord::StatementCache#execute we cannot remove
the unused params preparable.
see @ ActiveRecord::Querying#find_by_sql
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/elasticsearch_record/querying.rb', line 46 def find_by_sql(sql, binds = [], preparable: nil, &block) query = case sql when String # really find by SQL ElasticsearchRecord::Query.new( type: ElasticsearchRecord::Query::TYPE_SQL, body: { query: sql }, # IMPORTANT: Always provide all columns columns: source_column_names) when Hash ElasticsearchRecord::Query.new( type: ElasticsearchRecord::Query::TYPE_SEARCH, arguments: sql, # IMPORTANT: Always provide all columns columns: source_column_names) else sql end _load_from_sql(_query_by_sql(query, binds), &block) end |
#msearch(queries) ⇒ Object
executes a msearch by provided RAW queries.
Does NOT instantiate records.
114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/elasticsearch_record/querying.rb', line 114 def msearch(queries) # build new msearch query query = ElasticsearchRecord::Query.new( index: table_name, type: ElasticsearchRecord::Query::TYPE_MSEARCH, body: queries.map { |q| { search: q } }, # IMPORTANT: Always provide all columns columns: source_column_names) connection.exec_query(query, "#{name} Msearch") end |
#search(*args, &block) ⇒ Object
executes a search by provided RAW query - supports Elasticsearch::DSL gem if loaded
127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/elasticsearch_record/querying.rb', line 127 def search(*args, &block) begin # require the Elasticsearch::DSL gem, if loaded require 'elasticsearch/dsl' query = ::Elasticsearch::DSL::Search::Search.new(*args, &block).to_hash rescue LoadError query = args. rescue query = args. end find_by_query(query) end |