query_relation 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +63 -0
- data/lib/query_relation/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb98f89437c07c2bc344a161bab779426ec38e5a
|
4
|
+
data.tar.gz: 106a56ab8a18141722be7e7439ef54bde25a6d59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4a682b80e9b737cb889c7e3ba5a4cdfc23b93694327c67307bdd1f47171fa11b24015b0b05bd2424ba9b594a51404f9b1cda924c3af83f498cb093d21fd8e45
|
7
|
+
data.tar.gz: 6363baddbf6fde7e2a40b209250a59f4a9223c2bb37863b73b1111020cfb85344df32245b9b7dc2c660629c462be01336d8bfc84f549a1bd1d19358fe6568297
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Change Log
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
|
+
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
|
+
|
7
|
+
## [Unreleased]
|
8
|
+
|
9
|
+
## [0.1.1]
|
10
|
+
### Added
|
11
|
+
- Add CHANGELOG.md
|
12
|
+
- Update README with usage instructions.
|
13
|
+
|
14
|
+
[Unreleased]: https://github.com/ManageIQ/query_relation/compare/v0.1.1...HEAD
|
15
|
+
[0.1.0]: https://github.com/ManageIQ/query_relation/compare/v0.1.0...v0.1.1
|
data/README.md
CHANGED
@@ -18,6 +18,69 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
$ gem install query_relation
|
20
20
|
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
The `QueryRelation` class is provided to encapsulate building a relation. It is
|
24
|
+
a chainable interface, upon which query methods can be called, and final
|
25
|
+
execution is delayed until the last possible moment. It can be instantiated
|
26
|
+
directly, but the more common way to get access to one is to mixin the
|
27
|
+
`QueryRelation::Queryable` module into your collection.
|
28
|
+
|
29
|
+
`QueryRelation::Queryable` expects a method named `search` to be implemented by
|
30
|
+
the mixee. `search` should be written to take two parameters
|
31
|
+
|
32
|
+
- `mode`: one of `first`, `last`, or `all`
|
33
|
+
- `options`: a Hash containing the choices that were made by the caller. It
|
34
|
+
will contain the keys `:where`, `:select`, `:limit`, `:offset`, `:order`,
|
35
|
+
`group`, `:includes`, and/or `:references`
|
36
|
+
|
37
|
+
The `search` method should be written to process this set of options and return
|
38
|
+
an Array of the selection. It can use the options and mode in any way it sees
|
39
|
+
fit to optimally return the requested values.
|
40
|
+
|
41
|
+
### Example
|
42
|
+
|
43
|
+
Here's a simple example that supports limit and offset over a simple collection
|
44
|
+
to give an idea of how one might write a `search` method.
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
class MyCollection
|
48
|
+
include QueryRelation::Queryable
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
THE_COLLECTION = [1, 2, 3, 4].freeze
|
53
|
+
|
54
|
+
def search(mode, options)
|
55
|
+
collection = filter_collection_by_options(options)
|
56
|
+
|
57
|
+
case mode
|
58
|
+
when :first then collection.first
|
59
|
+
when :last then collection.last
|
60
|
+
when :all then collection
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def filter_collection_by_options(options)
|
65
|
+
collection = THE_COLLECTION
|
66
|
+
collection = collection.drop(options[:offset]) if options[:offset]
|
67
|
+
collection = collection.take(options[:limit]) if options[:limit]
|
68
|
+
collection
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
MyCollection.new.all.to_a
|
73
|
+
# => [1, 2, 3, 4]
|
74
|
+
MyCollection.new.limit(2).to_a
|
75
|
+
# => [1, 2]
|
76
|
+
MyCollection.new.limit(1).offset(2).to_a
|
77
|
+
# => [3]
|
78
|
+
MyCollection.new.first
|
79
|
+
# => 1
|
80
|
+
MyCollection.new.last
|
81
|
+
# => 4
|
82
|
+
```
|
83
|
+
|
21
84
|
## Development
|
22
85
|
|
23
86
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: query_relation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keenan Brock
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-11-
|
12
|
+
date: 2016-11-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- ".gitignore"
|
93
93
|
- ".rspec"
|
94
94
|
- ".travis.yml"
|
95
|
+
- CHANGELOG.md
|
95
96
|
- CODE_OF_CONDUCT.md
|
96
97
|
- Gemfile
|
97
98
|
- LICENSE.txt
|