Class: Quo::CollectionBackedQuery

Inherits:
Query show all
Defined in:
lib/quo/collection_backed_query.rb,
sig/generated/quo/collection_backed_query.rbs

Overview

Query object backed by in-memory collections

Constant Summary

Constants inherited from Query

Query::COERCE_TO_INT

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Query

compose, #copy, define_props_on_class, #inspect, inspect, #is_collection?, #merge, #next_page_query, #offset, #paged?, #previous_page_query, #quo_unwrap_unpaginated_query, #sanitised_page_size, #test_relation, #to_s, to_s, #transform, #transform?, #transformer, #unwrap, #unwrap_unpaginated

Class Method Details

.from(enumerable) ⇒ Quo::WrappedCollectionBackedQuery

Parameters:

  • enumerable (Enumerable[untyped])

Returns:



35
36
37
# File 'lib/quo/collection_backed_query.rb', line 35

def self.from(enumerable)
  Quo::WrappedCollectionBackedQuery.new(wrapped: enumerable)
end

.wrap(data = nil, props: {}, &block) ⇒ void

This method returns an undefined value.

Parameters:



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/quo/collection_backed_query.rb', line 14

def self.wrap(data = nil, props: {}, &block)
  raise ArgumentError, "either a query or a block must be provided" unless data || block

  if data && !(data.is_a?(::Enumerable) || data.is_a?(Quo::CollectionBackedQuery))
    raise ArgumentError,
      "Quo::CollectionBackedQuery.wrap requires an Enumerable or a Quo::CollectionBackedQuery instance; got #{data.class}. " \
      "Use Quo::RelationBackedQuery.wrap or Quo::RelationBackedQuery.from for ActiveRecord relations."
  end

  klass = Class.new(self)
  define_props_on_class(klass, props)
  if block
    klass.define_method(:collection, &block)
  else
    klass.define_method(:collection) { data }
  end
  klass
end

Instance Method Details

#collectionObject & Enumerable[untyped]

Returns:

  • (Object & Enumerable[untyped])


40
41
42
# File 'lib/quo/collection_backed_query.rb', line 40

def collection
  raise NotImplementedError, "Collection backed query objects must define a 'collection' method"
end

#collection?void

This method returns an undefined value.



61
62
63
# File 'lib/quo/collection_backed_query.rb', line 61

def collection?
  true
end

#configured_queryObject & Enumerable[untyped]

The configured query is the underlying query with paging

Returns:

  • (Object & Enumerable[untyped])


82
83
84
85
86
87
88
89
90
91
# File 'lib/quo/collection_backed_query.rb', line 82

def configured_query #: Object & Enumerable[untyped]
  q = underlying_query
  return q unless paged?

  if q.respond_to?(:[])
    q[offset, sanitised_page_size]
  else
    q
  end
end

#queryObject & Enumerable[untyped]

The default implementation of query just calls collection, however you can also override this method to return an ActiveRecord::Relation or any other query-like object as usual in a Query object.

Returns:

  • (Object & Enumerable[untyped])


47
48
49
# File 'lib/quo/collection_backed_query.rb', line 47

def query
  collection
end

#relation?void

This method returns an undefined value.



56
57
58
# File 'lib/quo/collection_backed_query.rb', line 56

def relation?
  false
end

#resultsQuo::Results

: Quo::Results

Returns:



51
52
53
# File 'lib/quo/collection_backed_query.rb', line 51

def results #: Quo::Results
  Quo::CollectionResults.new(self, transformer: transformer, total_count: @total_count)
end

#to_collectionvoid

This method returns an undefined value.



66
67
68
# File 'lib/quo/collection_backed_query.rb', line 66

def to_collection
  self
end

#underlying_queryObject & Enumerable[untyped]

Returns:

  • (Object & Enumerable[untyped])


77
78
79
# File 'lib/quo/collection_backed_query.rb', line 77

def underlying_query
  validated_query
end

#validated_queryObject

Returns:

  • (Object)


72
73
74
# File 'lib/quo/collection_backed_query.rb', line 72

def validated_query
  query
end