post_json 1.0.3

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.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +194 -0
  4. data/Rakefile +21 -0
  5. data/lib/core_ext/abstract_adapter_extend.rb +16 -0
  6. data/lib/core_ext/active_record_relation_extend.rb +16 -0
  7. data/lib/core_ext/hash_extend.rb +36 -0
  8. data/lib/generators/post_json/install/install_generator.rb +32 -0
  9. data/lib/generators/post_json/install/templates/create_post_json_documents.rb +13 -0
  10. data/lib/generators/post_json/install/templates/create_post_json_dynamic_indexes.rb +9 -0
  11. data/lib/generators/post_json/install/templates/create_post_json_model_settings.rb +18 -0
  12. data/lib/generators/post_json/install/templates/create_procedures.rb +120 -0
  13. data/lib/generators/post_json/install/templates/enable_extensions.rb +28 -0
  14. data/lib/generators/post_json/install/templates/initializer.rb +9 -0
  15. data/lib/post_json.rb +56 -0
  16. data/lib/post_json/base.rb +278 -0
  17. data/lib/post_json/concerns/argument_methods.rb +33 -0
  18. data/lib/post_json/concerns/dynamic_index_methods.rb +34 -0
  19. data/lib/post_json/concerns/finder_methods.rb +343 -0
  20. data/lib/post_json/concerns/query_methods.rb +157 -0
  21. data/lib/post_json/concerns/settings_methods.rb +106 -0
  22. data/lib/post_json/dynamic_index.rb +99 -0
  23. data/lib/post_json/model_settings.rb +17 -0
  24. data/lib/post_json/query_translator.rb +48 -0
  25. data/lib/post_json/version.rb +3 -0
  26. data/spec/dummy/Rakefile +6 -0
  27. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  28. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  29. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  33. data/spec/dummy/bin/bundle +3 -0
  34. data/spec/dummy/bin/rails +4 -0
  35. data/spec/dummy/bin/rake +4 -0
  36. data/spec/dummy/config.ru +4 -0
  37. data/spec/dummy/config/application.rb +30 -0
  38. data/spec/dummy/config/boot.rb +5 -0
  39. data/spec/dummy/config/database.yml +26 -0
  40. data/spec/dummy/config/environment.rb +5 -0
  41. data/spec/dummy/config/environments/development.rb +29 -0
  42. data/spec/dummy/config/environments/production.rb +80 -0
  43. data/spec/dummy/config/environments/test.rb +36 -0
  44. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  45. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  46. data/spec/dummy/config/initializers/inflections.rb +16 -0
  47. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  48. data/spec/dummy/config/initializers/post_json.rb +5 -0
  49. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  50. data/spec/dummy/config/initializers/session_store.rb +3 -0
  51. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  52. data/spec/dummy/config/locales/en.yml +23 -0
  53. data/spec/dummy/config/routes.rb +56 -0
  54. data/spec/dummy/db/migrate/20131015022029_enable_extensions.rb +28 -0
  55. data/spec/dummy/db/migrate/20131015022030_create_procedures.rb +120 -0
  56. data/spec/dummy/db/migrate/20131015022031_create_post_json_model_settings.rb +18 -0
  57. data/spec/dummy/db/migrate/20131015022032_create_post_json_collections.rb +16 -0
  58. data/spec/dummy/db/migrate/20131015022033_create_post_json_documents.rb +13 -0
  59. data/spec/dummy/db/migrate/20131015022034_create_post_json_dynamic_indexes.rb +9 -0
  60. data/spec/dummy/db/structure.sql +311 -0
  61. data/spec/dummy/public/404.html +58 -0
  62. data/spec/dummy/public/422.html +58 -0
  63. data/spec/dummy/public/500.html +57 -0
  64. data/spec/dummy/public/favicon.ico +0 -0
  65. data/spec/models/base_spec.rb +393 -0
  66. data/spec/models/collection_spec.rb +27 -0
  67. data/spec/models/queries_spec.rb +164 -0
  68. data/spec/modules/argument_methods_spec.rb +17 -0
  69. data/spec/modules/query_methods_spec.rb +69 -0
  70. data/spec/spec_helper.rb +54 -0
  71. metadata +184 -0
@@ -0,0 +1,56 @@
1
+ Dummy::Application.routes.draw do
2
+ # The priority is based upon order of creation: first created -> highest priority.
3
+ # See how all your routes lay out with "rake routes".
4
+
5
+ # You can have the root of your site routed with "root"
6
+ # root 'welcome#index'
7
+
8
+ # Example of regular route:
9
+ # get 'products/:id' => 'catalog#view'
10
+
11
+ # Example of named route that can be invoked with purchase_url(id: product.id)
12
+ # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
13
+
14
+ # Example resource route (maps HTTP verbs to controller actions automatically):
15
+ # resources :products
16
+
17
+ # Example resource route with options:
18
+ # resources :products do
19
+ # member do
20
+ # get 'short'
21
+ # post 'toggle'
22
+ # end
23
+ #
24
+ # collection do
25
+ # get 'sold'
26
+ # end
27
+ # end
28
+
29
+ # Example resource route with sub-resources:
30
+ # resources :products do
31
+ # resources :comments, :sales
32
+ # resource :seller
33
+ # end
34
+
35
+ # Example resource route with more complex sub-resources:
36
+ # resources :products do
37
+ # resources :comments
38
+ # resources :sales do
39
+ # get 'recent', on: :collection
40
+ # end
41
+ # end
42
+
43
+ # Example resource route with concerns:
44
+ # concern :toggleable do
45
+ # post 'toggle'
46
+ # end
47
+ # resources :posts, concerns: :toggleable
48
+ # resources :photos, concerns: :toggleable
49
+
50
+ # Example resource route within a namespace:
51
+ # namespace :admin do
52
+ # # Directs /admin/products/* to Admin::ProductsController
53
+ # # (app/controllers/admin/products_controller.rb)
54
+ # resources :products
55
+ # end
56
+ end
@@ -0,0 +1,28 @@
1
+ class EnableExtensions < ActiveRecord::Migration
2
+ def change
3
+ # Install Postgresql 9.2 with PLV8 (might require )
4
+ # 1. sudo add-apt-repository ppa:pitti/postgresql
5
+ # 2. sudo apt-get update
6
+ # 3. sudo apt-get install postgresql-9.2 postgresql-contrib-9.2 postgresql-server-dev-9.2 libv8-dev
7
+ # 4. sudo su - postgres
8
+ # 5. Enter psql and run "CREATE USER webnuts WITH PASSWORD 'webnuts';" and "ALTER USER webnuts CREATEDB;" and "ALTER USER webnuts SUPERUSER;"
9
+ # 6. git clone https://code.google.com/p/plv8js/
10
+ # 7. cd plv8js
11
+ # 8. make
12
+ # 9. sudo make install
13
+
14
+ # bundle exec rake db:create:all
15
+ # bundle exec rake db:migrate
16
+ # bundle exec rake db:test:prepare
17
+
18
+ # See all available extensions:
19
+ # ActiveRecord::Base.connection.execute("select * from pg_available_extensions;").each_row do |row|
20
+ # puts row.to_s
21
+ # end
22
+
23
+ enable_extension 'uuid-ossp' # generate universally unique identifiers (UUIDs)
24
+ enable_extension 'hstore' # data type for storing sets of (key, value) pairs
25
+ enable_extension 'plv8' # PL/JavaScript (v8) trusted procedural language
26
+ #enable_extension 'plcoffee' # PL/CoffeeScript (v8) trusted procedural language
27
+ end
28
+ end
@@ -0,0 +1,120 @@
1
+ # http://pgxn.org/dist/plv8/doc/plv8.html
2
+ # http://plv8-pgopen.herokuapp.com/
3
+ # http://www.craigkerstiens.com/2013/06/25/javascript-functions-for-postgres/
4
+ # http://www.postgresonline.com/journal/archives/272-Using-PLV8-to-build-JSON-selectors.html
5
+
6
+ class CreateProcedures < ActiveRecord::Migration
7
+ def change
8
+ ActiveRecord::Base.connection.execute(json_numeric_procedure)
9
+ ActiveRecord::Base.connection.execute(json_text_procedure)
10
+ ActiveRecord::Base.connection.execute(js_filter_procedure)
11
+ ActiveRecord::Base.connection.execute(json_selector_procedure)
12
+ ActiveRecord::Base.connection.execute(json_selectors_procedure)
13
+ ActiveRecord::Base.connection.execute(show_all_indexes_procedure)
14
+ # ActiveRecord::Base.connection.execute(show_indexes_procedure)
15
+ # ActiveRecord::Base.connection.execute(ensure_dynamic_index_procedure)
16
+ end
17
+
18
+ def json_numeric_procedure
19
+ "CREATE OR REPLACE FUNCTION json_numeric(key text, data json) RETURNS numeric AS $$
20
+ if (data == null) {
21
+ return null;
22
+ }
23
+ return data[key];
24
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;"
25
+ end
26
+
27
+ def json_text_procedure
28
+ "CREATE OR REPLACE FUNCTION json_text(key text, data json) RETURNS text AS $$
29
+ if (data == null) {
30
+ return null;
31
+ }
32
+ return data[key];
33
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;"
34
+ end
35
+
36
+ def js_filter_procedure
37
+ "create or replace function js_filter(js_function text, json_arguments text, data json) returns numeric as $$
38
+ if (data == null) {
39
+ return null;
40
+ }
41
+ eval('var func = ' + js_function);
42
+ eval('var args = ' + (json_arguments == '' ? 'null' : json_arguments));
43
+ var final_args = [data].concat(args);
44
+ var result = func.apply(null, final_args);
45
+ return result == true || 0 < parseInt(result) ? 1 : 0;
46
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;"
47
+ end
48
+
49
+ def json_selector_procedure
50
+ "CREATE OR REPLACE FUNCTION json_selector(selector text, data json) RETURNS text AS $$
51
+ if (data == null || selector == null || selector == '') {
52
+ return null;
53
+ }
54
+ var names = selector.split('.');
55
+ var result = names.reduce(function(previousValue, currentValue, index, array) {
56
+ if (previousValue == null) {
57
+ return null;
58
+ } else {
59
+ return previousValue[currentValue];
60
+ }
61
+ }, data);
62
+ return result;
63
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;"
64
+ end
65
+
66
+ def json_selectors_procedure
67
+ "CREATE OR REPLACE FUNCTION json_selectors(selectors text, data json) RETURNS json AS $$
68
+ var json_selector = plv8.find_function('json_selector');
69
+ var selectorArray = selectors.replace(/\s+/g, '').split(',');
70
+ var result = selectorArray.map(function(selector) { return json_selector(selector, data); });
71
+ return result;
72
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;"
73
+ end
74
+
75
+ def show_all_indexes_procedure
76
+ "CREATE OR REPLACE FUNCTION show_all_indexes() RETURNS json AS $$
77
+ var sql = \"SELECT c3.relname AS table, c2.relname AS index FROM pg_class c2 LEFT JOIN pg_index i ON c2.oid = i.indexrelid LEFT JOIN pg_class c1 ON c1.oid = i.indrelid RIGHT OUTER JOIN pg_class c3 ON c3.oid = c1.oid LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c3.relnamespace WHERE c3.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c3.oid) ORDER BY c3.relpages DESC;\"
78
+ return plv8.execute( sql );
79
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;"
80
+ end
81
+
82
+ # def show_indexes_procedure
83
+ # "CREATE OR REPLACE FUNCTION show_indexes(table_name text DEFAULT '', index_prefix text DEFAULT '') RETURNS json AS $$
84
+ # var show_all_indexes = plv8.find_function('show_all_indexes');
85
+ # var indexes = show_all_indexes();
86
+ # if (0 < (table_name || '').length) {
87
+ # indexes = indexes.filter(function(row) { return row['table'] === table_name; });
88
+ # }
89
+ # if (0 < (index_prefix || '').length) {
90
+ # indexes = indexes.filter(function(row) { return row['index'].lastIndexOf(index_prefix, 0) === 0; });
91
+ # }
92
+ # return indexes;
93
+ # $$ LANGUAGE plv8 IMMUTABLE STRICT;"
94
+ # end
95
+
96
+ # def ensure_dynamic_index_procedure
97
+ # raise ArgumentError, "index name should be: dyn_col_id_md5_hash_of_selector and truncated to a length of 63"
98
+ # raise ArgumentError, "it should only create 1 index and not multiple"
99
+
100
+
101
+ # # CREATE INDEX CONCURRENTLY post_json_documents_body_age ON post_json_documents(json_selector('age', body))
102
+ # "CREATE OR REPLACE FUNCTION ensure_dynamic_index(selectors text, collection_id text) RETURNS json AS $$
103
+ # var show_indexes = plv8.find_function('show_indexes');
104
+ # var colId = collection_id.replace('-', '');
105
+ # var indexPrefix = 'col_' + colId + '_';
106
+ # var existingIndexes = show_indexes('post_json_documents', indexPrefix).map(function(row) { return row.index; });
107
+ # var selectorArray = selectors.replace(/\s+/g, '').split(',');
108
+
109
+ # var indexes = selectorArray.map(function(selector) { return {'name': indexPrefix + selector.replace('.', '_'), selector: selector}; });
110
+ # var newIndexes = indexes.filter(function(index) { return existingIndexes.indexOf(index.name) == -1; });
111
+
112
+ # newIndexes.forEach(function(index) {
113
+ # var sql = \"CREATE INDEX \" + index.name + \" ON post_json_documents(json_selector('\" + index.selector + \"', body)) WHERE collection_id = '\" + colId + \"';\"
114
+ # plv8.execute( sql );
115
+ # });
116
+
117
+ # return newIndexes;
118
+ # $$ LANGUAGE plv8 IMMUTABLE STRICT;"
119
+ # end
120
+ end
@@ -0,0 +1,18 @@
1
+ class CreatePostJsonModelSettings < ActiveRecord::Migration
2
+ def change
3
+ create_table :post_json_model_settings, id: :uuid do |t|
4
+ t.text :collection_name, index: true, unique: true
5
+ t.json :meta, default: {}, null: false
6
+ t.boolean :use_timestamps, default: true
7
+ t.text :created_at_attribute_name, default: 'created_at', null: false
8
+ t.text :updated_at_attribute_name, default: 'updated_at', null: false
9
+ t.boolean :include_version_number, default: true
10
+ t.text :version_attribute_name, default: 'version', null: false
11
+ t.boolean :use_dynamic_index, default: true
12
+ t.integer :create_dynamic_index_milliseconds_threshold, default: 50
13
+ t.timestamps
14
+ end
15
+
16
+ execute "CREATE INDEX post_json_model_settings_lower_collection_name ON post_json_model_settings(lower(collection_name));"
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ class CreatePostJsonCollections < ActiveRecord::Migration
2
+ def change
3
+ create_table :post_json_collections, id: :uuid do |t|
4
+ t.text :name, index: true, unique: true
5
+ t.json :meta
6
+ t.boolean :use_timestamps, default: true
7
+ t.text :created_at_attribute_name, default: 'created_at', null: false
8
+ t.text :updated_at_attribute_name, default: 'updated_at', null: false
9
+ t.boolean :use_version_number, default: true
10
+ t.text :version_attribute_name, default: 'version', null: false
11
+ t.boolean :use_dynamic_index, default: true
12
+ t.integer :create_dynamic_index_milliseconds_threshold, default: 50
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ class CreatePostJsonDocuments < ActiveRecord::Migration
2
+ def change
3
+ create_table :post_json_documents, id: false do |t|
4
+ t.text :id, null: false, index: true
5
+ t.integer :__doc__version
6
+ t.json :__doc__body
7
+ t.uuid :__doc__model_settings_id
8
+ end
9
+
10
+ execute "CREATE UNIQUE INDEX post_json_documents_unique_id ON post_json_documents(id, __doc__model_settings_id);"
11
+ execute "ALTER TABLE post_json_documents ADD PRIMARY KEY (id, __doc__model_settings_id);"
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class CreatePostJsonDynamicIndexes < ActiveRecord::Migration
2
+ def change
3
+ create_table :post_json_dynamic_indexes, id: :uuid do |t|
4
+ t.text :selector, index: true, null: false
5
+ t.uuid :model_settings_id, index: true
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,311 @@
1
+ --
2
+ -- PostgreSQL database dump
3
+ --
4
+
5
+ SET statement_timeout = 0;
6
+ SET lock_timeout = 0;
7
+ SET client_encoding = 'UTF8';
8
+ SET standard_conforming_strings = on;
9
+ SET check_function_bodies = false;
10
+ SET client_min_messages = warning;
11
+
12
+ --
13
+ -- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
14
+ --
15
+
16
+ CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
17
+
18
+
19
+ --
20
+ -- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
21
+ --
22
+
23
+ COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
24
+
25
+
26
+ --
27
+ -- Name: plv8; Type: EXTENSION; Schema: -; Owner: -
28
+ --
29
+
30
+ CREATE EXTENSION IF NOT EXISTS plv8 WITH SCHEMA pg_catalog;
31
+
32
+
33
+ --
34
+ -- Name: EXTENSION plv8; Type: COMMENT; Schema: -; Owner: -
35
+ --
36
+
37
+ COMMENT ON EXTENSION plv8 IS 'PL/JavaScript (v8) trusted procedural language';
38
+
39
+
40
+ --
41
+ -- Name: hstore; Type: EXTENSION; Schema: -; Owner: -
42
+ --
43
+
44
+ CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;
45
+
46
+
47
+ --
48
+ -- Name: EXTENSION hstore; Type: COMMENT; Schema: -; Owner: -
49
+ --
50
+
51
+ COMMENT ON EXTENSION hstore IS 'data type for storing sets of (key, value) pairs';
52
+
53
+
54
+ --
55
+ -- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: -
56
+ --
57
+
58
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
59
+
60
+
61
+ --
62
+ -- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: -
63
+ --
64
+
65
+ COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';
66
+
67
+
68
+ SET search_path = public, pg_catalog;
69
+
70
+ --
71
+ -- Name: js_filter(text, text, json); Type: FUNCTION; Schema: public; Owner: -
72
+ --
73
+
74
+ CREATE FUNCTION js_filter(js_function text, json_arguments text, data json) RETURNS numeric
75
+ LANGUAGE plv8 IMMUTABLE STRICT
76
+ AS $$
77
+ if (data == null) {
78
+ return null;
79
+ }
80
+ eval('var func = ' + js_function);
81
+ eval('var args = ' + (json_arguments == '' ? 'null' : json_arguments));
82
+ var final_args = [data].concat(args);
83
+ var result = func.apply(null, final_args);
84
+ return result == true || 0 < parseInt(result) ? 1 : 0;
85
+ $$;
86
+
87
+
88
+ --
89
+ -- Name: json_numeric(text, json); Type: FUNCTION; Schema: public; Owner: -
90
+ --
91
+
92
+ CREATE FUNCTION json_numeric(key text, data json) RETURNS numeric
93
+ LANGUAGE plv8 IMMUTABLE STRICT
94
+ AS $$
95
+ if (data == null) {
96
+ return null;
97
+ }
98
+ return data[key];
99
+ $$;
100
+
101
+
102
+ --
103
+ -- Name: json_selector(text, json); Type: FUNCTION; Schema: public; Owner: -
104
+ --
105
+
106
+ CREATE FUNCTION json_selector(selector text, data json) RETURNS text
107
+ LANGUAGE plv8 IMMUTABLE STRICT
108
+ AS $$
109
+ if (data == null || selector == null || selector == '') {
110
+ return null;
111
+ }
112
+ var names = selector.split('.');
113
+ var result = names.reduce(function(previousValue, currentValue, index, array) {
114
+ if (previousValue == null) {
115
+ return null;
116
+ } else {
117
+ return previousValue[currentValue];
118
+ }
119
+ }, data);
120
+ return result;
121
+ $$;
122
+
123
+
124
+ --
125
+ -- Name: json_selectors(text, json); Type: FUNCTION; Schema: public; Owner: -
126
+ --
127
+
128
+ CREATE FUNCTION json_selectors(selectors text, data json) RETURNS json
129
+ LANGUAGE plv8 IMMUTABLE STRICT
130
+ AS $$
131
+ var json_selector = plv8.find_function('json_selector');
132
+ var selectorArray = selectors.replace(/ +/g, '').split(',');
133
+ var result = selectorArray.map(function(selector) { return json_selector(selector, data); });
134
+ return result;
135
+ $$;
136
+
137
+
138
+ --
139
+ -- Name: json_text(text, json); Type: FUNCTION; Schema: public; Owner: -
140
+ --
141
+
142
+ CREATE FUNCTION json_text(key text, data json) RETURNS text
143
+ LANGUAGE plv8 IMMUTABLE STRICT
144
+ AS $$
145
+ if (data == null) {
146
+ return null;
147
+ }
148
+ return data[key];
149
+ $$;
150
+
151
+
152
+ --
153
+ -- Name: show_all_indexes(); Type: FUNCTION; Schema: public; Owner: -
154
+ --
155
+
156
+ CREATE FUNCTION show_all_indexes() RETURNS json
157
+ LANGUAGE plv8 IMMUTABLE STRICT
158
+ AS $$
159
+ var sql = "SELECT c3.relname AS table, c2.relname AS index FROM pg_class c2 LEFT JOIN pg_index i ON c2.oid = i.indexrelid LEFT JOIN pg_class c1 ON c1.oid = i.indrelid RIGHT OUTER JOIN pg_class c3 ON c3.oid = c1.oid LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c3.relnamespace WHERE c3.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND pg_catalog.pg_table_is_visible(c3.oid) ORDER BY c3.relpages DESC;"
160
+ return plv8.execute( sql );
161
+ $$;
162
+
163
+
164
+ SET default_tablespace = '';
165
+
166
+ SET default_with_oids = false;
167
+
168
+ --
169
+ -- Name: post_json_collections; Type: TABLE; Schema: public; Owner: -; Tablespace:
170
+ --
171
+
172
+ CREATE TABLE post_json_collections (
173
+ id uuid DEFAULT uuid_generate_v4() NOT NULL,
174
+ name text,
175
+ meta json,
176
+ use_timestamps boolean DEFAULT true,
177
+ created_at_attribute_name text DEFAULT 'created_at'::text NOT NULL,
178
+ updated_at_attribute_name text DEFAULT 'updated_at'::text NOT NULL,
179
+ use_version_number boolean DEFAULT true,
180
+ version_attribute_name text DEFAULT 'version'::text NOT NULL,
181
+ use_dynamic_index boolean DEFAULT true,
182
+ create_dynamic_index_milliseconds_threshold integer DEFAULT 50,
183
+ created_at timestamp without time zone,
184
+ updated_at timestamp without time zone
185
+ );
186
+
187
+
188
+ --
189
+ -- Name: post_json_documents; Type: TABLE; Schema: public; Owner: -; Tablespace:
190
+ --
191
+
192
+ CREATE TABLE post_json_documents (
193
+ id text NOT NULL,
194
+ __doc__version integer,
195
+ __doc__body json,
196
+ __doc__model_settings_id uuid NOT NULL
197
+ );
198
+
199
+
200
+ --
201
+ -- Name: post_json_dynamic_indexes; Type: TABLE; Schema: public; Owner: -; Tablespace:
202
+ --
203
+
204
+ CREATE TABLE post_json_dynamic_indexes (
205
+ id uuid DEFAULT uuid_generate_v4() NOT NULL,
206
+ selector text NOT NULL,
207
+ model_settings_id uuid,
208
+ created_at timestamp without time zone,
209
+ updated_at timestamp without time zone
210
+ );
211
+
212
+
213
+ --
214
+ -- Name: post_json_model_settings; Type: TABLE; Schema: public; Owner: -; Tablespace:
215
+ --
216
+
217
+ CREATE TABLE post_json_model_settings (
218
+ id uuid DEFAULT uuid_generate_v4() NOT NULL,
219
+ collection_name text,
220
+ meta json DEFAULT '{}'::json NOT NULL,
221
+ use_timestamps boolean DEFAULT true,
222
+ created_at_attribute_name text DEFAULT 'created_at'::text NOT NULL,
223
+ updated_at_attribute_name text DEFAULT 'updated_at'::text NOT NULL,
224
+ include_version_number boolean DEFAULT true,
225
+ version_attribute_name text DEFAULT 'version'::text NOT NULL,
226
+ use_dynamic_index boolean DEFAULT true,
227
+ create_dynamic_index_milliseconds_threshold integer DEFAULT 50,
228
+ created_at timestamp without time zone,
229
+ updated_at timestamp without time zone
230
+ );
231
+
232
+
233
+ --
234
+ -- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -; Tablespace:
235
+ --
236
+
237
+ CREATE TABLE schema_migrations (
238
+ version character varying(255) NOT NULL
239
+ );
240
+
241
+
242
+ --
243
+ -- Name: post_json_collections_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
244
+ --
245
+
246
+ ALTER TABLE ONLY post_json_collections
247
+ ADD CONSTRAINT post_json_collections_pkey PRIMARY KEY (id);
248
+
249
+
250
+ --
251
+ -- Name: post_json_documents_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
252
+ --
253
+
254
+ ALTER TABLE ONLY post_json_documents
255
+ ADD CONSTRAINT post_json_documents_pkey PRIMARY KEY (id, __doc__model_settings_id);
256
+
257
+
258
+ --
259
+ -- Name: post_json_dynamic_indexes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
260
+ --
261
+
262
+ ALTER TABLE ONLY post_json_dynamic_indexes
263
+ ADD CONSTRAINT post_json_dynamic_indexes_pkey PRIMARY KEY (id);
264
+
265
+
266
+ --
267
+ -- Name: post_json_model_settings_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
268
+ --
269
+
270
+ ALTER TABLE ONLY post_json_model_settings
271
+ ADD CONSTRAINT post_json_model_settings_pkey PRIMARY KEY (id);
272
+
273
+
274
+ --
275
+ -- Name: post_json_documents_unique_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
276
+ --
277
+
278
+ CREATE UNIQUE INDEX post_json_documents_unique_id ON post_json_documents USING btree (id, __doc__model_settings_id);
279
+
280
+
281
+ --
282
+ -- Name: post_json_model_settings_lower_collection_name; Type: INDEX; Schema: public; Owner: -; Tablespace:
283
+ --
284
+
285
+ CREATE INDEX post_json_model_settings_lower_collection_name ON post_json_model_settings USING btree (lower(collection_name));
286
+
287
+
288
+ --
289
+ -- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: -; Tablespace:
290
+ --
291
+
292
+ CREATE UNIQUE INDEX unique_schema_migrations ON schema_migrations USING btree (version);
293
+
294
+
295
+ --
296
+ -- PostgreSQL database dump complete
297
+ --
298
+
299
+ SET search_path TO "$user",public;
300
+
301
+ INSERT INTO schema_migrations (version) VALUES ('20131015022029');
302
+
303
+ INSERT INTO schema_migrations (version) VALUES ('20131015022030');
304
+
305
+ INSERT INTO schema_migrations (version) VALUES ('20131015022031');
306
+
307
+ INSERT INTO schema_migrations (version) VALUES ('20131015022032');
308
+
309
+ INSERT INTO schema_migrations (version) VALUES ('20131015022033');
310
+
311
+ INSERT INTO schema_migrations (version) VALUES ('20131015022034');