ahoy_matey 3.0.4 → 3.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +1 -1
- data/README.md +57 -3
- data/lib/ahoy.rb +4 -0
- data/lib/ahoy/query_methods.rb +45 -0
- data/lib/ahoy/version.rb +1 -1
- data/lib/generators/ahoy/templates/active_record_migration.rb.tt +3 -3
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17572400fdaab440040c753cf23084f2a47868e5c1ed12229e85fd1904e9c937
|
4
|
+
data.tar.gz: cc917af046906e308830fa1ffa9543db1bc1fe0f79488ccaddef090e6366433d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 325caa06934a20bf7a58f573fff7359b7058cf63e3e7576c48faf1bd5d08ac2564810a28e5a775c3ac324170754db4de35d46f43c0b421f8c4977760af19d153
|
7
|
+
data.tar.gz: e7af674522e09e3fb472b52546f30d10b743e2b2814efd97162d05cb1d4f9b13615dce211cd83e291da16e370a86cf7d8d384b16ad60d8af07c8ced8fbd17f59
|
data/CHANGELOG.md
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -435,7 +435,7 @@ Previously set cookies are automatically deleted.
|
|
435
435
|
|
436
436
|
## Data Retention
|
437
437
|
|
438
|
-
Delete older data with:
|
438
|
+
Data should only be retained for as long as it’s needed. Delete older data with:
|
439
439
|
|
440
440
|
```ruby
|
441
441
|
Ahoy::Visit.where("started_at < ?", 2.years.ago).find_in_batches do |visits|
|
@@ -445,6 +445,12 @@ Ahoy::Visit.where("started_at < ?", 2.years.ago).find_in_batches do |visits|
|
|
445
445
|
end
|
446
446
|
```
|
447
447
|
|
448
|
+
You can use [Rollup](https://github.com/ankane/rollup) to aggregate important data before you do.
|
449
|
+
|
450
|
+
```ruby
|
451
|
+
Ahoy::Visit.rollup("Visits", interval: "hour")
|
452
|
+
```
|
453
|
+
|
448
454
|
Delete data for a specific user with:
|
449
455
|
|
450
456
|
```ruby
|
@@ -580,7 +586,7 @@ Ahoy::Visit.group(:referring_domain).count
|
|
580
586
|
|
581
587
|
### Querying Events
|
582
588
|
|
583
|
-
Ahoy provides
|
589
|
+
Ahoy provides a few methods on the event model to make querying easier.
|
584
590
|
|
585
591
|
To query on both name and properties, you can use:
|
586
592
|
|
@@ -591,9 +597,17 @@ Ahoy::Event.where_event("Viewed product", product_id: 123).count
|
|
591
597
|
Or just query properties with:
|
592
598
|
|
593
599
|
```ruby
|
594
|
-
Ahoy::Event.where_props(product_id: 123).count
|
600
|
+
Ahoy::Event.where_props(product_id: 123, category: "Books").count
|
601
|
+
```
|
602
|
+
|
603
|
+
Group by properties with:
|
604
|
+
|
605
|
+
```ruby
|
606
|
+
Ahoy::Event.group_prop(:product_id, :category).count
|
595
607
|
```
|
596
608
|
|
609
|
+
Note: MySQL and MariaDB always return string keys (include `"null"` for `nil`) for `group_prop`.
|
610
|
+
|
597
611
|
### Funnels
|
598
612
|
|
599
613
|
It’s easy to create funnels.
|
@@ -606,6 +620,29 @@ viewed_checkout_ids = Ahoy::Event.where(user_id: added_item_ids, name: "Viewed c
|
|
606
620
|
|
607
621
|
The same approach also works with visitor tokens.
|
608
622
|
|
623
|
+
### Rollups
|
624
|
+
|
625
|
+
Improve query performance by pre-aggregating data with [Rollup](https://github.com/ankane/rollup).
|
626
|
+
|
627
|
+
```ruby
|
628
|
+
Ahoy::Event.where(name: "Viewed store").rollup("Store views")
|
629
|
+
```
|
630
|
+
|
631
|
+
This is only needed if you have a lot of data.
|
632
|
+
|
633
|
+
### Forecasting
|
634
|
+
|
635
|
+
To forecast future visits and events, check out [Prophet](https://github.com/ankane/prophet).
|
636
|
+
|
637
|
+
```ruby
|
638
|
+
daily_visits = Ahoy::Visit.group_by_day(:started_at).count # uses Groupdate
|
639
|
+
Prophet.forecast(daily_visits)
|
640
|
+
```
|
641
|
+
|
642
|
+
### Recommendations
|
643
|
+
|
644
|
+
To make recommendations based on events, check out [Disco](https://github.com/ankane/disco#ahoy).
|
645
|
+
|
609
646
|
## Tutorials
|
610
647
|
|
611
648
|
- [Tracking Metrics with Ahoy and Blazer](https://gorails.com/episodes/internal-metrics-with-ahoy-and-blazer)
|
@@ -722,3 +759,20 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
|
|
722
759
|
- Fix bugs and [submit pull requests](https://github.com/ankane/ahoy/pulls)
|
723
760
|
- Write, clarify, or fix documentation
|
724
761
|
- Suggest or add new features
|
762
|
+
|
763
|
+
To get started with development:
|
764
|
+
|
765
|
+
```sh
|
766
|
+
git clone https://github.com/ankane/ahoy.git
|
767
|
+
cd ahoy
|
768
|
+
bundle install
|
769
|
+
bundle exec rake test
|
770
|
+
```
|
771
|
+
|
772
|
+
To test query methods, start PostgreSQL, MySQL, and MongoDB and use:
|
773
|
+
|
774
|
+
```sh
|
775
|
+
createdb ahoy_test
|
776
|
+
mysqladmin create ahoy_test
|
777
|
+
bundle exec rake test:query_methods
|
778
|
+
```
|
data/lib/ahoy.rb
CHANGED
@@ -119,6 +119,10 @@ ActiveSupport.on_load(:action_view) do
|
|
119
119
|
end
|
120
120
|
|
121
121
|
# Mongoid
|
122
|
+
# TODO use
|
123
|
+
# ActiveSupport.on_load(:mongoid) do
|
124
|
+
# Mongoid::Document::ClassMethods.include(Ahoy::Model)
|
125
|
+
# end
|
122
126
|
if defined?(ActiveModel)
|
123
127
|
ActiveModel::Callbacks.include(Ahoy::Model)
|
124
128
|
end
|
data/lib/ahoy/query_methods.rb
CHANGED
@@ -31,6 +31,7 @@ module Ahoy
|
|
31
31
|
end
|
32
32
|
else
|
33
33
|
properties.each do |k, v|
|
34
|
+
# TODO cast to json instead
|
34
35
|
relation = relation.where("properties REGEXP ?", "[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "").gsub("+", "\\\\+")}[,}]")
|
35
36
|
end
|
36
37
|
end
|
@@ -57,6 +58,7 @@ module Ahoy
|
|
57
58
|
end
|
58
59
|
else
|
59
60
|
properties.each do |k, v|
|
61
|
+
# TODO cast to jsonb instead
|
60
62
|
relation = relation.where("properties SIMILAR TO ?", "%[{,]#{{k.to_s => v}.to_json.sub(/\A\{/, "").sub(/\}\z/, "").gsub("+", "\\\\+")}[,}]%")
|
61
63
|
end
|
62
64
|
end
|
@@ -66,6 +68,49 @@ module Ahoy
|
|
66
68
|
relation
|
67
69
|
end
|
68
70
|
alias_method :where_properties, :where_props
|
71
|
+
|
72
|
+
def group_prop(*props)
|
73
|
+
# like with group
|
74
|
+
props.flatten!
|
75
|
+
|
76
|
+
relation = self
|
77
|
+
if respond_to?(:columns_hash)
|
78
|
+
column_type = columns_hash["properties"].type
|
79
|
+
adapter_name = connection.adapter_name.downcase
|
80
|
+
else
|
81
|
+
adapter_name = "mongoid"
|
82
|
+
end
|
83
|
+
case adapter_name
|
84
|
+
when "mongoid"
|
85
|
+
raise "Adapter not supported: #{adapter_name}"
|
86
|
+
when /mysql/
|
87
|
+
if connection.try(:mariadb?)
|
88
|
+
props.each do |prop|
|
89
|
+
quoted_prop = connection.quote("$.#{prop}")
|
90
|
+
relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(properties, #{quoted_prop}))")
|
91
|
+
end
|
92
|
+
else
|
93
|
+
column = column_type == :json ? "properties" : "CAST(properties AS JSON)"
|
94
|
+
props.each do |prop|
|
95
|
+
quoted_prop = connection.quote("$.#{prop}")
|
96
|
+
relation = relation.group("JSON_UNQUOTE(JSON_EXTRACT(#{column}, #{quoted_prop}))")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
when /postgres|postgis/
|
100
|
+
# convert to jsonb to fix
|
101
|
+
# could not identify an equality operator for type json
|
102
|
+
# and for text columns
|
103
|
+
cast = [:jsonb, :hstore].include?(column_type) ? "" : "::jsonb"
|
104
|
+
|
105
|
+
props.each do |prop|
|
106
|
+
quoted_prop = connection.quote(prop)
|
107
|
+
relation = relation.group("properties#{cast} -> #{quoted_prop}")
|
108
|
+
end
|
109
|
+
else
|
110
|
+
raise "Adapter not supported: #{adapter_name}"
|
111
|
+
end
|
112
|
+
relation
|
113
|
+
end
|
69
114
|
end
|
70
115
|
end
|
71
116
|
end
|
data/lib/ahoy/version.rb
CHANGED
@@ -41,10 +41,10 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
|
|
41
41
|
t.string :os_version
|
42
42
|
t.string :platform
|
43
43
|
|
44
|
-
t.
|
44
|
+
t.datetime :started_at
|
45
45
|
end
|
46
46
|
|
47
|
-
add_index :ahoy_visits,
|
47
|
+
add_index :ahoy_visits, :visit_token, unique: true
|
48
48
|
|
49
49
|
create_table :ahoy_events do |t|
|
50
50
|
t.references :visit
|
@@ -52,7 +52,7 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
|
|
52
52
|
|
53
53
|
t.string :name
|
54
54
|
t.<%= properties_type %> :properties
|
55
|
-
t.
|
55
|
+
t.datetime :time
|
56
56
|
end
|
57
57
|
|
58
58
|
add_index :ahoy_events, [:name, :time]<% if properties_type == "jsonb" %><% if rails52? %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahoy_matey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -192,6 +192,34 @@ dependencies:
|
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: browser
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '2.0'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '2.0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: user_agent_parser
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
195
223
|
description:
|
196
224
|
email: andrew@chartkick.com
|
197
225
|
executables: []
|