Module: Card::Query

Defined in:
lib/card/query.rb,
lib/card/query/join.rb,
lib/card/query/value.rb,
lib/card/query/clause.rb,
lib/card/query/act_query.rb,
lib/card/query/card_class.rb,
lib/card/query/card_query.rb,
lib/card/query/action_query.rb,
lib/card/query/sql_statement.rb,
lib/card/query/abstract_query.rb,
lib/card/query/card_query/run.rb,
lib/card/query/reference_query.rb,
lib/card/query/card_query/custom.rb,
lib/card/query/value/match_value.rb,
lib/card/query/abstract_query/tie.rb,
lib/card/query/card_query/sorting.rb,
lib/card/query/card_query/found_by.rb,
lib/card/query/sql_statement/joins.rb,
lib/card/query/sql_statement/order.rb,
lib/card/query/sql_statement/where.rb,
lib/card/query/card_query/conjunctions.rb,
lib/card/query/card_query/normalization.rb,
lib/card/query/card_query/interpretation.rb,
lib/card/query/abstract_query/query_helper.rb,
lib/card/query/card_query/match_attributes.rb,
lib/card/query/card_query/reference_attributes.rb,
lib/card/query/card_query/relational_attributes.rb

Overview

Card::Query is for finding implicit lists (or counts of lists) of cards.

Search and Set cards use Card::Query to query the database, and it’s also frequently used directly in code.

Query “statements” (objects, really) are made in CQL (Card Query Language). Because CQL is used by Sharks, [the primary CQL Syntax documentation is on decko.org](decko.org/CQL_Syntax). Note that the examples there are in JSON, like Search card content, but statements in Card::Query are in ruby form.

In Decko’s current form, Card::Query generates and executes SQL statements. However, the SQL generation is largely (not yet fully) separated from the CQL statement interpretation.

The most common way to use Card::Query is as follows:

list_of_cards = Card::Query.run(statement)

This is equivalent to:

query = Card::Query.new(statement)
list_of_cards = query.run

Upon initiation, the query is interpreted, and the following key objects are populated:

  • @join - an Array of Card::Query::Join objects

  • @conditions - an Array of conditions

  • @mod - a Hash of other query-altering keys

  • @subqueries - a list of other queries nested within this one

Each condition is either a SQL-ready string (boo) or an Array in this form:

[field_string_or_sym, (Card::Value::Query object)]

Defined Under Namespace

Modules: CardClass, Clause Classes: AbstractQuery, ActQuery, ActionQuery, CardQuery, Join, ReferenceQuery, SqlStatement, Value

Constant Summary collapse

CONJUNCTIONS =
{ any: :or, in: :or, or: :or, all: :and, and: :and }.freeze
MODIFIERS =

“dir” is DEPRECATED in favor of sort_dir “sort” is DEPRECATED in favor of sort_by, except in cases where sort’s value is a hash

%i[conj return sort_by sort_as sort_dir sort dir group limit offset]
.each_with_object({}) { |v, h| h[v] = nil }
OPERATORS =
%w[!= = =~ < > in ~ is].each_with_object({}) { |v, h| h[v] = v }.merge(
  { eq: "=", gt: ">", lt: "<", match: "~", ne: "!=",
    "not in": "not in", "is not": "is not", "!": "is not" }.stringify_keys
)
DEFAULT_ORDER_DIRS =
{ update: "desc", relevance: "desc" }.freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.attributesObject

Returns the value of attribute attributes.



98
99
100
# File 'lib/card/query.rb', line 98

def attributes
  @attributes
end

Class Method Details

.class_for(type) ⇒ Object



108
109
110
# File 'lib/card/query.rb', line 108

def class_for type
  const_get "#{type.capitalize}Query"
end

.new(statement, comment = nil) ⇒ Object



100
101
102
# File 'lib/card/query.rb', line 100

def new statement, comment=nil
  Query::CardQuery.new statement, comment
end

.run(statement, comment = nil) ⇒ Object



104
105
106
# File 'lib/card/query.rb', line 104

def run statement, comment=nil
  new(statement, comment).run
end

.safe_sql(txt) ⇒ Object



112
113
114
115
116
117
# File 'lib/card/query.rb', line 112

def safe_sql txt
  txt = txt.to_s
  raise "CQL contains disallowed characters: #{txt}" if txt.match?(/[^\w\s*().,]/)

  txt
end