· 7 years ago · Dec 09, 2018, 02:50 AM
1
2require 'bundler/setup'
3Bundler.require :default
4require 'veritas'
5require 'veritas/optimizer'
6require 'veritas-do-adapter'
7require 'virtus'
8require 'do_postgres'
9
10require 'dm-mapper'
11
12require 'debugger'
13
14url = "postgres://rails:rails@localhost:5432/ar_dm2"
15
16DataMapper.setup(:postgres, url)
17DataObjects.logger.set_log('do.log', :debug)
18connection = DataObjects::Connection.new(url)
19
20connection.create_command(<<-SQL).execute_non_query
21DROP TABLE IF EXISTS "public"."users";
22DROP SEQUENCE IF EXISTS "users_id_seq";
23
24CREATE SEQUENCE "users_id_seq" INCREMENT 1 START 1 MAXVALUE 9223372036854775807 MINVALUE 1 CACHE 1;
25ALTER TABLE "users_id_seq" OWNER TO "rails";
26
27CREATE TABLE "public"."users" (
28 "id" int4 NOT NULL DEFAULT nextval('users_id_seq'::regclass),
29 "name" varchar(255) NOT NULL
30)
31WITH (OIDS=FALSE);
32ALTER TABLE "public"."users" OWNER TO "rails";
33
34insert into "public"."users" ( "name") values ( 'octocat');
35insert into "public"."users" ( "name") values ( 'dhh');
36SQL
37
38 class User
39 attr_accessor :likes, :id, :name
40
41 def initialize(attributes={})
42 @id = attributes[:id]
43 @name = attributes[:name]
44 @likes = attributes[:likes]
45 end
46 end
47
48 class Mapper < DataMapper::Mapper::VeritasMapper
49 map :id, to: :id, :type => Integer
50 map :name, to: :name, :type => String
51
52 model User
53 relation_name :users
54 repository :postgres
55 end
56
57
58 DataMapper.finalize
59
60 profiles_json = [
61 {"profile"=>{"user_id"=>1, "likes"=>"meat, kats"}},
62 {"profile"=>{"user_id"=>2, "likes"=>"ruby, mac"}},
63 {"profile"=>{"user_id"=>3, "likes"=>"be invisible"}}
64 ]
65
66 profiles_header = [
67 [:user_id, Integer],
68 [:likes, String ]
69 ]
70 profiles_tuple = profiles_json.map do |profile|
71 [ profile['profile']['user_id'], profile['profile']['likes']]
72 end
73 profiles_relation = Veritas::Relation::Base.new('profiles', profiles_header, profiles_tuple)
74
75
76 puts "Example from gist"
77
78 adapter = Veritas::Adapter::DataObjects.new(url)
79 users_header = [ [ :id, Integer ], [ :name, String ] ]
80
81 user_alt_relation = Veritas::Relation::Gateway.new(
82 adapter, Veritas::Relation::Base.new('users', users_header))
83
84 new_alt_relation = user_alt_relation.join(profiles_relation) do |r|
85 r.id.eq(r.user_id)
86 end
87
88 new_alt_relation.each do |user|
89 puts "User #{user[:id]} named #{user[:name]} likes #{user[:likes]}"
90 end
91
92 puts "Use Ruby object"
93
94 user_relation = DataMapper[User]
95
96 new_relation = user_relation.join(profiles_relation) do |r|
97 puts "Joining id=#{r.id} and user_id=#{r.user_id}"
98 r.id.eq(r.user_id)
99 end
100
101 new_relation.each do |user|
102 puts "User #{user.id} named #{user.name} likes #{user.likes}"
103 end