diametric 0.1.1-java
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 +7 -0
- data/Gemfile +28 -0
- data/Jarfile +20 -0
- data/LICENSE.txt +22 -0
- data/README.md +264 -0
- data/Rakefile +49 -0
- data/bin/datomic-rest +33 -0
- data/bin/download-datomic +13 -0
- data/datomic_version.yml +4 -0
- data/diametric-java.gemspec +39 -0
- data/ext/diametric/DiametricCollection.java +147 -0
- data/ext/diametric/DiametricConnection.java +113 -0
- data/ext/diametric/DiametricDatabase.java +107 -0
- data/ext/diametric/DiametricEntity.java +90 -0
- data/ext/diametric/DiametricListenableFuture.java +47 -0
- data/ext/diametric/DiametricObject.java +66 -0
- data/ext/diametric/DiametricPeer.java +414 -0
- data/ext/diametric/DiametricService.java +102 -0
- data/ext/diametric/DiametricUUID.java +61 -0
- data/ext/diametric/DiametricUtils.java +183 -0
- data/lib/boolean_type.rb +3 -0
- data/lib/diametric.rb +42 -0
- data/lib/diametric/config.rb +54 -0
- data/lib/diametric/config/environment.rb +42 -0
- data/lib/diametric/entity.rb +659 -0
- data/lib/diametric/errors.rb +13 -0
- data/lib/diametric/generators/active_model.rb +42 -0
- data/lib/diametric/persistence.rb +48 -0
- data/lib/diametric/persistence/common.rb +82 -0
- data/lib/diametric/persistence/peer.rb +154 -0
- data/lib/diametric/persistence/rest.rb +107 -0
- data/lib/diametric/query.rb +259 -0
- data/lib/diametric/railtie.rb +52 -0
- data/lib/diametric/rest_service.rb +74 -0
- data/lib/diametric/service_base.rb +77 -0
- data/lib/diametric/transactor.rb +86 -0
- data/lib/diametric/version.rb +3 -0
- data/lib/diametric_service.jar +0 -0
- data/lib/tasks/create_schema.rb +27 -0
- data/lib/tasks/diametric_config.rb +45 -0
- data/lib/value_enums.rb +8 -0
- data/spec/conf_helper.rb +55 -0
- data/spec/config/free-transactor-template.properties +73 -0
- data/spec/config/logback.xml +59 -0
- data/spec/data/seattle-data0.dtm +452 -0
- data/spec/data/seattle-data1.dtm +326 -0
- data/spec/developer_create_sample.rb +39 -0
- data/spec/developer_query_spec.rb +120 -0
- data/spec/diametric/config_spec.rb +60 -0
- data/spec/diametric/entity_spec.rb +476 -0
- data/spec/diametric/peer_api_spec.rb +147 -0
- data/spec/diametric/persistence/peer_many2many_spec.rb +76 -0
- data/spec/diametric/persistence/peer_spec.rb +27 -0
- data/spec/diametric/persistence/rest_spec.rb +30 -0
- data/spec/diametric/persistence_spec.rb +59 -0
- data/spec/diametric/query_spec.rb +118 -0
- data/spec/diametric/rest_service_spec.rb +56 -0
- data/spec/diametric/transactor_spec.rb +68 -0
- data/spec/integration_spec.rb +107 -0
- data/spec/parent_child_sample.rb +42 -0
- data/spec/peer_integration_spec.rb +121 -0
- data/spec/peer_seattle_spec.rb +200 -0
- data/spec/rc2013_seattle_big.rb +82 -0
- data/spec/rc2013_seattle_small.rb +60 -0
- data/spec/rc2013_simple_sample.rb +72 -0
- data/spec/seattle_integration_spec.rb +106 -0
- data/spec/simple_validation_sample.rb +31 -0
- data/spec/spec_helper.rb +63 -0
- data/spec/support/entities.rb +157 -0
- data/spec/support/gen_entity_class.rb +9 -0
- data/spec/support/persistence_examples.rb +104 -0
- data/spec/test_version_file.yml +4 -0
- metadata +290 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'diametric/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.name = "diametric"
|
9
|
+
gem.version = Diametric::VERSION
|
10
|
+
gem.authors = ["Clinton N. Dreisbach", "Ryan K. Neufeld", "Yoko Harada"]
|
11
|
+
gem.email = ["crnixon@gmail.com", "ryan@thinkrelevance.com", "yoko@thinkrelevance.com"]
|
12
|
+
gem.summary = %q{ActiveModel for Datomic (JRuby)}
|
13
|
+
gem.description = <<EOF
|
14
|
+
Diametric is a library for building schemas, queries, and transactions
|
15
|
+
for Datomic from Ruby objects. It is also used to map Ruby objects
|
16
|
+
as entities into a Datomic database.
|
17
|
+
EOF
|
18
|
+
gem.homepage = "https://github.com/relevance/diametric"
|
19
|
+
gem.platform = 'java'
|
20
|
+
|
21
|
+
gem.files = %w(Gemfile Jarfile LICENSE.txt README.md Rakefile datomic_version.yml diametric-java.gemspec) + Dir.glob('lib/**/*') + Dir.glob('ext/**/*') + Dir.glob('spec/**/*')
|
22
|
+
gem.executables = []
|
23
|
+
gem.test_files = Dir.glob("spec/**/*.rb")
|
24
|
+
gem.require_paths = ["lib"]
|
25
|
+
gem.executables = ["datomic-rest", "download-datomic"]
|
26
|
+
|
27
|
+
gem.add_dependency 'edn', '~> 1.0.2'
|
28
|
+
gem.add_dependency 'activesupport', '~> 3.2.14'
|
29
|
+
gem.add_dependency 'activemodel', '~> 3.2.14'
|
30
|
+
gem.add_dependency 'datomic-client', '~> 0.4.1'
|
31
|
+
gem.add_dependency 'rubyzip', '~> 0.9.9'
|
32
|
+
gem.add_dependency 'lock_jar', '~> 0.7.5'
|
33
|
+
gem.add_dependency 'jruby-openssl', '~> 0.8.8'
|
34
|
+
gem.add_dependency 'uuid', '~> 2.3.7'
|
35
|
+
gem.add_dependency 'rspec', '~> 2.14.1'
|
36
|
+
gem.add_dependency 'rake-compiler', '~> 0.9.1'
|
37
|
+
|
38
|
+
gem.extensions = ['Rakefile']
|
39
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.util.Collection;
|
4
|
+
import java.util.Iterator;
|
5
|
+
|
6
|
+
import org.jruby.Ruby;
|
7
|
+
import org.jruby.RubyClass;
|
8
|
+
import org.jruby.RubyObject;
|
9
|
+
import org.jruby.anno.JRubyClass;
|
10
|
+
import org.jruby.anno.JRubyMethod;
|
11
|
+
import org.jruby.javasupport.JavaUtil;
|
12
|
+
import org.jruby.runtime.Block;
|
13
|
+
import org.jruby.runtime.ThreadContext;
|
14
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
15
|
+
|
16
|
+
@JRubyClass(name = "Diametric::Persistence::Collection")
|
17
|
+
public class DiametricCollection extends RubyObject {
|
18
|
+
// should be a Ruby's Enumerable
|
19
|
+
private static final long serialVersionUID = 7656855654760249694L;
|
20
|
+
private Collection query_result = null;
|
21
|
+
|
22
|
+
public DiametricCollection(Ruby runtime, RubyClass klazz) {
|
23
|
+
super(runtime, klazz);
|
24
|
+
}
|
25
|
+
|
26
|
+
void init(Object result) {
|
27
|
+
if (result instanceof Collection) {
|
28
|
+
this.query_result = (Collection)result;
|
29
|
+
} else {
|
30
|
+
throw new RuntimeException("Wrong type of query result");
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
Object toJava() {
|
35
|
+
return query_result;
|
36
|
+
}
|
37
|
+
|
38
|
+
@JRubyMethod
|
39
|
+
public IRubyObject to_java(ThreadContext context) {
|
40
|
+
return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), query_result);
|
41
|
+
}
|
42
|
+
|
43
|
+
@JRubyMethod(name="==", required=1)
|
44
|
+
public IRubyObject op_equal(ThreadContext context, IRubyObject arg) {
|
45
|
+
Ruby runtime = context.getRuntime();
|
46
|
+
if (arg instanceof DiametricCollection) {
|
47
|
+
DiametricCollection other = (DiametricCollection)arg;
|
48
|
+
if (query_result.toString().equals(other.toJava().toString())) {
|
49
|
+
return runtime.getTrue();
|
50
|
+
} else {
|
51
|
+
return runtime.getFalse();
|
52
|
+
}
|
53
|
+
} else {
|
54
|
+
return runtime.getFalse();
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
@JRubyMethod
|
59
|
+
public IRubyObject to_s(ThreadContext context) {
|
60
|
+
return context.getRuntime().newString(query_result.toString());
|
61
|
+
}
|
62
|
+
|
63
|
+
@JRubyMethod(name = "all?")
|
64
|
+
public static IRubyObject all_p(ThreadContext context, IRubyObject self, final Block block) {
|
65
|
+
return context.getRuntime().getNil();
|
66
|
+
}
|
67
|
+
|
68
|
+
@JRubyMethod(name = "any?")
|
69
|
+
public static IRubyObject any_p(ThreadContext context, IRubyObject self, final Block block) {
|
70
|
+
return context.getRuntime().getNil();
|
71
|
+
}
|
72
|
+
|
73
|
+
@JRubyMethod
|
74
|
+
public static IRubyObject chunk(ThreadContext context, IRubyObject self, final Block block) {
|
75
|
+
return context.getRuntime().getNil();
|
76
|
+
}
|
77
|
+
|
78
|
+
@JRubyMethod
|
79
|
+
public static IRubyObject chunk(ThreadContext context, IRubyObject self, final IRubyObject initialState, final Block block) {
|
80
|
+
return context.getRuntime().getNil();
|
81
|
+
}
|
82
|
+
|
83
|
+
@JRubyMethod
|
84
|
+
public static IRubyObject collect(ThreadContext context, IRubyObject self, final Block block) {
|
85
|
+
return context.getRuntime().getNil();
|
86
|
+
}
|
87
|
+
|
88
|
+
@JRubyMethod
|
89
|
+
public static IRubyObject collect_concat(ThreadContext context, IRubyObject self, final Block block) {
|
90
|
+
return context.getRuntime().getNil();
|
91
|
+
}
|
92
|
+
|
93
|
+
@JRubyMethod
|
94
|
+
public static IRubyObject count(ThreadContext context, IRubyObject self, final Block block) {
|
95
|
+
return context.getRuntime().getNil();
|
96
|
+
}
|
97
|
+
|
98
|
+
@JRubyMethod
|
99
|
+
public static IRubyObject count(ThreadContext context, IRubyObject self, final IRubyObject methodArg, final Block block) {
|
100
|
+
return context.getRuntime().getNil();
|
101
|
+
}
|
102
|
+
|
103
|
+
@JRubyMethod
|
104
|
+
public static IRubyObject cycle(ThreadContext context, IRubyObject self, final Block block) {
|
105
|
+
return context.getRuntime().getNil();
|
106
|
+
}
|
107
|
+
|
108
|
+
@JRubyMethod
|
109
|
+
public static IRubyObject cycle(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) {
|
110
|
+
return context.getRuntime().getNil();
|
111
|
+
}
|
112
|
+
|
113
|
+
@JRubyMethod
|
114
|
+
public static IRubyObject detect(ThreadContext context, IRubyObject self, final Block block) {
|
115
|
+
return context.getRuntime().getNil();
|
116
|
+
}
|
117
|
+
|
118
|
+
@JRubyMethod
|
119
|
+
public static IRubyObject detect(ThreadContext context, IRubyObject self, IRubyObject ifnone, final Block block) {
|
120
|
+
return context.getRuntime().getNil();
|
121
|
+
}
|
122
|
+
|
123
|
+
@JRubyMethod
|
124
|
+
public static IRubyObject drop(ThreadContext context, IRubyObject self, IRubyObject n, final Block block) {
|
125
|
+
return context.getRuntime().getNil();
|
126
|
+
}
|
127
|
+
|
128
|
+
@JRubyMethod
|
129
|
+
public static IRubyObject drop_while(ThreadContext context, IRubyObject self, final Block block) {
|
130
|
+
return context.getRuntime().getNil();
|
131
|
+
}
|
132
|
+
|
133
|
+
@JRubyMethod
|
134
|
+
public static IRubyObject each_cons(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) {
|
135
|
+
return context.getRuntime().getNil();
|
136
|
+
}
|
137
|
+
|
138
|
+
@JRubyMethod(rest = true)
|
139
|
+
public static IRubyObject each_entry(ThreadContext context, final IRubyObject self, final IRubyObject[] args, final Block block) {
|
140
|
+
return context.getRuntime().getNil();
|
141
|
+
}
|
142
|
+
|
143
|
+
@JRubyMethod
|
144
|
+
public static IRubyObject each_slice(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) {
|
145
|
+
return context.getRuntime().getNil();
|
146
|
+
}
|
147
|
+
}
|
@@ -0,0 +1,113 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.util.Date;
|
4
|
+
import java.util.List;
|
5
|
+
|
6
|
+
import org.jruby.Ruby;
|
7
|
+
import org.jruby.RubyClass;
|
8
|
+
import org.jruby.RubyObject;
|
9
|
+
import org.jruby.RubyTime;
|
10
|
+
import org.jruby.anno.JRubyClass;
|
11
|
+
import org.jruby.anno.JRubyMethod;
|
12
|
+
import org.jruby.javasupport.JavaUtil;
|
13
|
+
import org.jruby.javasupport.util.RuntimeHelpers;
|
14
|
+
import org.jruby.runtime.ThreadContext;
|
15
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
16
|
+
|
17
|
+
@JRubyClass(name = "Diametric::Persistence::Connection")
|
18
|
+
public class DiametricConnection extends RubyObject {
|
19
|
+
private static final long serialVersionUID = 3806301567154638371L;
|
20
|
+
//conn should a datomic.Connection type
|
21
|
+
private Object conn = null;
|
22
|
+
|
23
|
+
public DiametricConnection(Ruby runtime, RubyClass klazz) {
|
24
|
+
super(runtime, klazz);
|
25
|
+
}
|
26
|
+
|
27
|
+
void init(Object conn) {
|
28
|
+
this.conn = conn;
|
29
|
+
}
|
30
|
+
|
31
|
+
Object toJava() {
|
32
|
+
return conn;
|
33
|
+
}
|
34
|
+
|
35
|
+
@JRubyMethod
|
36
|
+
public IRubyObject to_java(ThreadContext context) {
|
37
|
+
return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), conn);
|
38
|
+
}
|
39
|
+
|
40
|
+
@JRubyMethod
|
41
|
+
public IRubyObject db(ThreadContext context) {
|
42
|
+
try {
|
43
|
+
Object database = clojure.lang.RT.var("datomic.api", "db").invoke(conn);
|
44
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
45
|
+
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
46
|
+
diametric_database.init(database);
|
47
|
+
return diametric_database;
|
48
|
+
} catch (Throwable t) {
|
49
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
@JRubyMethod
|
54
|
+
public IRubyObject transact(ThreadContext context, IRubyObject arg) {
|
55
|
+
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg);
|
56
|
+
if (tx_data == null) {
|
57
|
+
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
58
|
+
}
|
59
|
+
|
60
|
+
try {
|
61
|
+
Object future = clojure.lang.RT.var("datomic.api", "transact").invoke(conn, tx_data);
|
62
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::ListenableFuture");
|
63
|
+
DiametricListenableFuture diametric_listenable = (DiametricListenableFuture)clazz.allocate();
|
64
|
+
diametric_listenable.init(future);
|
65
|
+
return diametric_listenable;
|
66
|
+
} catch (Throwable t) {
|
67
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
@JRubyMethod
|
72
|
+
public IRubyObject transact_async(ThreadContext context, IRubyObject arg) {
|
73
|
+
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg);
|
74
|
+
if (tx_data == null) {
|
75
|
+
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
76
|
+
}
|
77
|
+
|
78
|
+
try {
|
79
|
+
Object future = clojure.lang.RT.var("datomic.api", "transact-async").invoke(conn, tx_data);
|
80
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::ListenableFuture");
|
81
|
+
DiametricListenableFuture diametric_listenable = (DiametricListenableFuture)clazz.allocate();
|
82
|
+
diametric_listenable.init(future);
|
83
|
+
return diametric_listenable;
|
84
|
+
} catch (Throwable t) {
|
85
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
@JRubyMethod
|
90
|
+
public IRubyObject gc_storage(ThreadContext context, IRubyObject arg) {
|
91
|
+
if (!(arg.respondsTo("to_time"))) {
|
92
|
+
throw context.getRuntime().newArgumentError("Wrong argument type");
|
93
|
+
}
|
94
|
+
RubyTime rubyTime = (RubyTime) RuntimeHelpers.invoke(context, arg, "to_time");
|
95
|
+
Date olderThan = rubyTime.getJavaDate();
|
96
|
+
try {
|
97
|
+
clojure.lang.RT.var("datomic.api", "gc-strage").invoke(conn, olderThan);
|
98
|
+
} catch (Throwable t) {
|
99
|
+
throw context.getRuntime().newRuntimeError("Datomic error: " + t.getMessage());
|
100
|
+
}
|
101
|
+
return context.getRuntime().getNil();
|
102
|
+
}
|
103
|
+
|
104
|
+
@JRubyMethod
|
105
|
+
public IRubyObject release(ThreadContext context) {
|
106
|
+
try {
|
107
|
+
clojure.lang.RT.var("datomic.api", "release").invoke(conn);
|
108
|
+
} catch (Throwable t) {
|
109
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
110
|
+
}
|
111
|
+
return context.getRuntime().getNil();
|
112
|
+
}
|
113
|
+
}
|
@@ -0,0 +1,107 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.util.List;
|
4
|
+
import java.util.Map;
|
5
|
+
|
6
|
+
import org.jruby.Ruby;
|
7
|
+
import org.jruby.RubyClass;
|
8
|
+
import org.jruby.RubyFixnum;
|
9
|
+
import org.jruby.RubyHash;
|
10
|
+
import org.jruby.RubyObject;
|
11
|
+
import org.jruby.RubyString;
|
12
|
+
import org.jruby.anno.JRubyClass;
|
13
|
+
import org.jruby.anno.JRubyMethod;
|
14
|
+
import org.jruby.javasupport.JavaUtil;
|
15
|
+
import org.jruby.runtime.ThreadContext;
|
16
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
17
|
+
|
18
|
+
import datomic.Database;
|
19
|
+
import datomic.Entity;
|
20
|
+
|
21
|
+
@JRubyClass(name = "Diametric::Persistence::Database")
|
22
|
+
public class DiametricDatabase extends RubyObject {
|
23
|
+
private static final long serialVersionUID = 6043433195693171937L;
|
24
|
+
// database supposed to be datomic.Database type
|
25
|
+
private Object database = null;
|
26
|
+
|
27
|
+
public DiametricDatabase(Ruby runtime, RubyClass klazz) {
|
28
|
+
super(runtime, klazz);
|
29
|
+
}
|
30
|
+
|
31
|
+
void init(Object database) {
|
32
|
+
this.database = database;
|
33
|
+
}
|
34
|
+
|
35
|
+
Object toJava() {
|
36
|
+
return database;
|
37
|
+
}
|
38
|
+
|
39
|
+
@JRubyMethod
|
40
|
+
public IRubyObject to_java(ThreadContext context) {
|
41
|
+
return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), database);
|
42
|
+
}
|
43
|
+
|
44
|
+
@JRubyMethod
|
45
|
+
public IRubyObject entity(ThreadContext context, IRubyObject arg) {
|
46
|
+
if (!(arg instanceof RubyFixnum)) {
|
47
|
+
throw context.getRuntime().newArgumentError("Argument should be Fixnum");
|
48
|
+
}
|
49
|
+
Long entityId = (Long) arg.toJava(Long.class);
|
50
|
+
try {
|
51
|
+
Entity entity = (Entity) clojure.lang.RT.var("datomic.api", "entity").invoke(database, entityId);
|
52
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Entity");
|
53
|
+
DiametricEntity diametric_entity = (DiametricEntity)clazz.allocate();
|
54
|
+
diametric_entity.init(entity);
|
55
|
+
return diametric_entity;
|
56
|
+
} catch (Throwable t) {
|
57
|
+
throw context.getRuntime().newRuntimeError("Datomic Error: " + t.getMessage());
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
@JRubyMethod
|
62
|
+
public IRubyObject with(ThreadContext context, IRubyObject arg) {
|
63
|
+
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg);
|
64
|
+
if (tx_data == null) {
|
65
|
+
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
66
|
+
}
|
67
|
+
try {
|
68
|
+
Map map = (Map) clojure.lang.RT.var("datomic.api", "with").invoke(database, tx_data);
|
69
|
+
return RubyHash.newHash(context.getRuntime(), map, null);
|
70
|
+
} catch (Throwable t) {
|
71
|
+
throw context.getRuntime().newRuntimeError("Datomic Error: " + t.getMessage());
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
@JRubyMethod
|
76
|
+
public IRubyObject as_of(ThreadContext context, IRubyObject arg) {
|
77
|
+
Object t_value = DiametricUtils.convertRubyToJava(context, arg);
|
78
|
+
try {
|
79
|
+
Database db_asof_t = (Database) clojure.lang.RT.var("datomic.api", "as-of").invoke(database, t_value);
|
80
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
81
|
+
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
82
|
+
diametric_database.init(db_asof_t);
|
83
|
+
return diametric_database;
|
84
|
+
} catch (Throwable t) {
|
85
|
+
throw context.getRuntime().newRuntimeError("Datomic Error: " + t.getMessage());
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
@JRubyMethod
|
90
|
+
public IRubyObject since(ThreadContext context, IRubyObject arg) {
|
91
|
+
Object t_value = DiametricUtils.convertRubyToJava(context, arg);
|
92
|
+
try {
|
93
|
+
Database db_since_t = (Database) clojure.lang.RT.var("datomic.api", "since").invoke(database, t_value);
|
94
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
95
|
+
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
96
|
+
diametric_database.init(db_since_t);
|
97
|
+
return diametric_database;
|
98
|
+
} catch (Throwable t) {
|
99
|
+
throw context.getRuntime().newRuntimeError("Datomic Error: " + t.getMessage());
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
@JRubyMethod
|
104
|
+
public IRubyObject id(ThreadContext context) {
|
105
|
+
return RubyString.newString(context.getRuntime(), ((Database)database).id());
|
106
|
+
}
|
107
|
+
}
|
@@ -0,0 +1,90 @@
|
|
1
|
+
package diametric;
|
2
|
+
|
3
|
+
import java.util.Collection;
|
4
|
+
|
5
|
+
import org.jruby.Ruby;
|
6
|
+
import org.jruby.RubyArray;
|
7
|
+
import org.jruby.RubyClass;
|
8
|
+
import org.jruby.RubyFixnum;
|
9
|
+
import org.jruby.RubyObject;
|
10
|
+
import org.jruby.RubyString;
|
11
|
+
import org.jruby.anno.JRubyClass;
|
12
|
+
import org.jruby.anno.JRubyMethod;
|
13
|
+
import org.jruby.javasupport.JavaUtil;
|
14
|
+
import org.jruby.runtime.ThreadContext;
|
15
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
16
|
+
|
17
|
+
@JRubyClass(name = "Diametric::Persistence::Entity")
|
18
|
+
public class DiametricEntity extends RubyObject {
|
19
|
+
private static final long serialVersionUID = 3906852174830144427L;
|
20
|
+
//entity should be datomic.Entity type
|
21
|
+
private Object entity = null;
|
22
|
+
|
23
|
+
public DiametricEntity(Ruby runtime, RubyClass klazz) {
|
24
|
+
super(runtime, klazz);
|
25
|
+
}
|
26
|
+
|
27
|
+
void init(Object entity) {
|
28
|
+
this.entity = entity;
|
29
|
+
}
|
30
|
+
|
31
|
+
Object toJava() {
|
32
|
+
return entity;
|
33
|
+
}
|
34
|
+
|
35
|
+
@JRubyMethod
|
36
|
+
public IRubyObject to_java(ThreadContext context) {
|
37
|
+
return JavaUtil.convertJavaToUsableRubyObject(context.getRuntime(), entity);
|
38
|
+
}
|
39
|
+
|
40
|
+
@JRubyMethod
|
41
|
+
public IRubyObject db(ThreadContext context) {
|
42
|
+
try {
|
43
|
+
Object database = clojure.lang.RT.var("datomic.api", "db").invoke(entity);
|
44
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
45
|
+
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
46
|
+
diametric_database.init(database);
|
47
|
+
return diametric_database;
|
48
|
+
} catch (Throwable t) {
|
49
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
@JRubyMethod(name={"[]","get"}, required=1)
|
54
|
+
public IRubyObject op_aref(ThreadContext context, IRubyObject arg) {
|
55
|
+
String key = (String) arg.toJava(String.class);
|
56
|
+
Object value = clojure.lang.RT.var("clojure.core", "get").invoke(entity, key);
|
57
|
+
return DiametricUtils.convertJavaToRuby(context, value);
|
58
|
+
}
|
59
|
+
|
60
|
+
@JRubyMethod
|
61
|
+
public IRubyObject keys(ThreadContext context) {
|
62
|
+
Collection keys = (Collection) clojure.lang.RT.var("clojure.core", "keys").invoke(entity);
|
63
|
+
RubyArray ruby_keys = RubyArray.newArray(context.getRuntime());
|
64
|
+
for (Object key : keys) {
|
65
|
+
// keys are clojure.lang.Keyword
|
66
|
+
ruby_keys.append(RubyString.newString(context.getRuntime(), key.toString()));
|
67
|
+
}
|
68
|
+
return ruby_keys;
|
69
|
+
}
|
70
|
+
|
71
|
+
@JRubyMethod
|
72
|
+
public IRubyObject touch(ThreadContext context) {
|
73
|
+
try {
|
74
|
+
Object touched_entity = clojure.lang.RT.var("datomic.api", "touch").invoke(entity);
|
75
|
+
entity = touched_entity;
|
76
|
+
return this;
|
77
|
+
} catch (Throwable t) {
|
78
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
@JRubyMethod
|
83
|
+
public IRubyObject eid(ThreadContext context) {
|
84
|
+
if (entity instanceof datomic.query.EntityMap) {
|
85
|
+
Long eid = (Long) ((datomic.query.EntityMap)entity).eid;
|
86
|
+
return RubyFixnum.newFixnum(context.getRuntime(), eid);
|
87
|
+
}
|
88
|
+
return context.getRuntime().getNil();
|
89
|
+
}
|
90
|
+
}
|