diametric 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/Gemfile +3 -3
- data/Jarfile +13 -6
- data/LICENSE.txt +2 -2
- data/README.md +57 -26
- data/Rakefile +1 -0
- data/bin/datomic-rest +1 -1
- data/bin/download-datomic +1 -1
- data/datomic_version.yml +2 -2
- data/diametric.gemspec +8 -7
- data/ext/diametric/DiametricCollection.java +45 -38
- data/ext/diametric/DiametricConnection.java +16 -15
- data/ext/diametric/DiametricDatabase.java +9 -8
- data/ext/diametric/DiametricEntity.java +104 -21
- data/ext/diametric/DiametricObject.java +12 -1
- data/ext/diametric/DiametricPeer.java +52 -31
- data/ext/diametric/DiametricService.java +2 -0
- data/ext/diametric/DiametricSet.java +11 -4
- data/ext/diametric/DiametricUUID.java +8 -1
- data/ext/diametric/DiametricUtils.java +90 -62
- data/lib/diametric.rb +1 -0
- data/lib/diametric/associations/collection.rb +103 -0
- data/lib/diametric/entity.rb +166 -103
- data/lib/diametric/persistence/common.rb +0 -44
- data/lib/diametric/persistence/peer.rb +53 -2
- data/lib/diametric/persistence/rest.rb +27 -1
- data/lib/diametric/query.rb +49 -31
- data/lib/diametric/rest_service.rb +8 -9
- data/lib/diametric/service_base.rb +7 -7
- data/lib/diametric/transactor.rb +6 -5
- data/lib/diametric/version.rb +1 -1
- data/lib/diametric_service.jar +0 -0
- data/spec/config/free-transactor-template.properties +6 -6
- data/spec/developer_query_spec.rb +17 -6
- data/spec/diametric/entity_spec.rb +62 -139
- data/spec/diametric/peer_api_spec.rb +23 -23
- data/spec/diametric/persistence/peer_spec.rb +73 -11
- data/spec/diametric/persistence/rest_spec.rb +108 -16
- data/spec/diametric/query_spec.rb +3 -3
- data/spec/diametric/rest_service_spec.rb +4 -4
- data/spec/diametric/schema_spec.rb +526 -0
- data/spec/diametric/transactor_spec.rb +5 -6
- data/spec/integration_spec.rb +7 -7
- data/spec/peer_integration_spec.rb +25 -1
- data/spec/peer_seattle_spec.rb +1 -2
- data/spec/spec_helper.rb +31 -4
- data/spec/support/cardinarity_many_example.rb +37 -0
- data/spec/support/entities.rb +127 -0
- data/spec/support/has_a_example.rb +31 -0
- data/spec/support/has_many_example.rb +79 -0
- data/spec/support/persistence_examples.rb +13 -5
- data/spec/support/various_types_examples.rb +163 -0
- data/spec/test_version_file.yml +2 -2
- metadata +66 -15
@@ -55,7 +55,7 @@ public class DiametricDatabase extends RubyObject {
|
|
55
55
|
throw context.getRuntime().newArgumentError("Argument should be Fixnum or dbid object");
|
56
56
|
}
|
57
57
|
try {
|
58
|
-
Entity entity = (Entity)
|
58
|
+
Entity entity = (Entity) DiametricService.getFn("datomic.api", "entity").invoke(database, entityId);
|
59
59
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Entity");
|
60
60
|
DiametricEntity diametric_entity = (DiametricEntity)clazz.allocate();
|
61
61
|
diametric_entity.init(entity);
|
@@ -67,12 +67,13 @@ public class DiametricDatabase extends RubyObject {
|
|
67
67
|
|
68
68
|
@JRubyMethod
|
69
69
|
public IRubyObject with(ThreadContext context, IRubyObject arg) {
|
70
|
-
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg);
|
71
|
-
if (tx_data == null) {
|
72
|
-
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
73
|
-
}
|
74
70
|
try {
|
75
|
-
|
71
|
+
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg); // may raise exception
|
72
|
+
if (tx_data == null) {
|
73
|
+
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
74
|
+
}
|
75
|
+
|
76
|
+
Map map = (Map) DiametricService.getFn("datomic.api", "with").invoke(database, tx_data);
|
76
77
|
return RubyHash.newHash(context.getRuntime(), map, null);
|
77
78
|
} catch (Throwable t) {
|
78
79
|
throw context.getRuntime().newRuntimeError("Datomic Error: " + t.getMessage());
|
@@ -83,7 +84,7 @@ public class DiametricDatabase extends RubyObject {
|
|
83
84
|
public IRubyObject as_of(ThreadContext context, IRubyObject arg) {
|
84
85
|
Object t_value = DiametricUtils.convertRubyToJava(context, arg);
|
85
86
|
try {
|
86
|
-
Database db_asof_t = (Database)
|
87
|
+
Database db_asof_t = (Database) DiametricService.getFn("datomic.api", "as-of").invoke(database, t_value);
|
87
88
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
88
89
|
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
89
90
|
diametric_database.init(db_asof_t);
|
@@ -97,7 +98,7 @@ public class DiametricDatabase extends RubyObject {
|
|
97
98
|
public IRubyObject since(ThreadContext context, IRubyObject arg) {
|
98
99
|
Object t_value = DiametricUtils.convertRubyToJava(context, arg);
|
99
100
|
try {
|
100
|
-
Database db_since_t = (Database)
|
101
|
+
Database db_since_t = (Database) DiametricService.getFn("datomic.api", "since").invoke(database, t_value);
|
101
102
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
102
103
|
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
103
104
|
diametric_database.init(db_since_t);
|
@@ -1,6 +1,8 @@
|
|
1
1
|
package diametric;
|
2
2
|
|
3
3
|
import java.util.Collection;
|
4
|
+
import java.util.List;
|
5
|
+
import java.util.Map;
|
4
6
|
|
5
7
|
import org.jruby.Ruby;
|
6
8
|
import org.jruby.RubyArray;
|
@@ -14,12 +16,21 @@ import org.jruby.javasupport.JavaUtil;
|
|
14
16
|
import org.jruby.runtime.ThreadContext;
|
15
17
|
import org.jruby.runtime.builtin.IRubyObject;
|
16
18
|
|
19
|
+
import clojure.lang.Var;
|
20
|
+
|
17
21
|
@JRubyClass(name = "Diametric::Persistence::Entity")
|
18
22
|
public class DiametricEntity extends RubyObject {
|
19
23
|
private static final long serialVersionUID = 3906852174830144427L;
|
20
24
|
//entity should be datomic.Entity type
|
21
25
|
private Object entity = null;
|
22
26
|
|
27
|
+
static IRubyObject getDiametricEntity(ThreadContext context, Object value) {
|
28
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Entity");
|
29
|
+
DiametricEntity diametric_entity = (DiametricEntity)clazz.allocate();
|
30
|
+
diametric_entity.init(value);
|
31
|
+
return diametric_entity;
|
32
|
+
}
|
33
|
+
|
23
34
|
public DiametricEntity(Ruby runtime, RubyClass klazz) {
|
24
35
|
super(runtime, klazz);
|
25
36
|
}
|
@@ -40,7 +51,7 @@ public class DiametricEntity extends RubyObject {
|
|
40
51
|
@JRubyMethod
|
41
52
|
public IRubyObject db(ThreadContext context) {
|
42
53
|
try {
|
43
|
-
Object database =
|
54
|
+
Object database = DiametricService.getFn("datomic.api", "db").invoke(entity);
|
44
55
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
45
56
|
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
46
57
|
diametric_database.init(database);
|
@@ -49,29 +60,11 @@ public class DiametricEntity extends RubyObject {
|
|
49
60
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
50
61
|
}
|
51
62
|
}
|
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
|
-
|
63
|
+
|
71
64
|
@JRubyMethod
|
72
65
|
public IRubyObject touch(ThreadContext context) {
|
73
66
|
try {
|
74
|
-
Object touched_entity =
|
67
|
+
Object touched_entity = DiametricService.getFn("datomic.api", "touch").invoke(entity);
|
75
68
|
entity = touched_entity;
|
76
69
|
return this;
|
77
70
|
} catch (Throwable t) {
|
@@ -87,4 +80,94 @@ public class DiametricEntity extends RubyObject {
|
|
87
80
|
}
|
88
81
|
return context.getRuntime().getNil();
|
89
82
|
}
|
83
|
+
|
84
|
+
@JRubyMethod(name={"==","eql?"}, required=1)
|
85
|
+
public IRubyObject eql_p(ThreadContext context, IRubyObject arg) {
|
86
|
+
Object other = DiametricUtils.convertRubyToJava(context, arg);
|
87
|
+
try {
|
88
|
+
Var var = DiametricService.getFn("clojure.core", "=");
|
89
|
+
Boolean value = (Boolean)var.invoke(entity, other);
|
90
|
+
return context.getRuntime().newBoolean(value);
|
91
|
+
} catch (Throwable t) {
|
92
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
@JRubyMethod(name={"[]","get"}, required=1)
|
97
|
+
public IRubyObject op_aref(ThreadContext context, IRubyObject arg) {
|
98
|
+
String key = (String) arg.toJava(String.class);
|
99
|
+
try {
|
100
|
+
Var var = DiametricService.getFn("clojure.core", "get");
|
101
|
+
Object value = var.invoke(entity, key);
|
102
|
+
return DiametricUtils.convertJavaToRuby(context, value);
|
103
|
+
} catch (Throwable t) {
|
104
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
@JRubyMethod(name={"has_key?","include?", "key?", "member?"}, required=1)
|
109
|
+
public IRubyObject has_key_p(ThreadContext context, IRubyObject arg) {
|
110
|
+
String key = (String) arg.toJava(String.class);
|
111
|
+
try {
|
112
|
+
Var var = DiametricService.getFn("clojure.core", "contains?");
|
113
|
+
Boolean value = (Boolean)var.invoke(entity, key);
|
114
|
+
return context.getRuntime().newBoolean(value);
|
115
|
+
} catch (Throwable t) {
|
116
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
@JRubyMethod
|
121
|
+
public IRubyObject keys(ThreadContext context) {
|
122
|
+
try {
|
123
|
+
Var var = DiametricService.getFn("clojure.core", "keys");
|
124
|
+
List<Object> keys = (List<Object>) var.invoke(entity);
|
125
|
+
RubyArray ruby_keys = RubyArray.newArray(context.getRuntime());
|
126
|
+
for (Object key : keys) {
|
127
|
+
// keys are clojure.lang.Keyword
|
128
|
+
ruby_keys.append(RubyString.newString(context.getRuntime(), key.toString()));
|
129
|
+
}
|
130
|
+
return ruby_keys;
|
131
|
+
} catch (Throwable t) {
|
132
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
@JRubyMethod
|
137
|
+
public IRubyObject values(ThreadContext context) {
|
138
|
+
try {
|
139
|
+
Var var = DiametricService.getFn("clojure.core", "vals");
|
140
|
+
List<Object> keys = (List<Object>) var.invoke(entity);
|
141
|
+
RubyArray ruby_keys = RubyArray.newArray(context.getRuntime());
|
142
|
+
for (Object key : keys) {
|
143
|
+
// keys are clojure.lang.Keyword
|
144
|
+
ruby_keys.append(RubyString.newString(context.getRuntime(), key.toString()));
|
145
|
+
}
|
146
|
+
return ruby_keys;
|
147
|
+
} catch (Throwable t) {
|
148
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
@JRubyMethod(name={"length", "size"})
|
153
|
+
public IRubyObject length(ThreadContext context) {
|
154
|
+
try {
|
155
|
+
Var var = DiametricService.getFn("clojure.core", "count");
|
156
|
+
Integer count = (Integer) var.invoke(entity);
|
157
|
+
return context.getRuntime().newFixnum(count);
|
158
|
+
} catch (Throwable t) {
|
159
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
@JRubyMethod
|
164
|
+
public IRubyObject to_s(ThreadContext context) {
|
165
|
+
try {
|
166
|
+
Var var = DiametricService.getFn("clojure.core", "str");
|
167
|
+
String str = (String) var.invoke(entity);
|
168
|
+
return context.getRuntime().newString(str);
|
169
|
+
} catch (Throwable t) {
|
170
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
171
|
+
}
|
172
|
+
}
|
90
173
|
}
|
@@ -59,8 +59,19 @@ public class DiametricObject extends RubyObject {
|
|
59
59
|
}
|
60
60
|
}
|
61
61
|
|
62
|
-
@JRubyMethod
|
62
|
+
@JRubyMethod(name={"to_s", "to_edn"})
|
63
63
|
public IRubyObject to_s(ThreadContext context) {
|
64
|
+
if (java_object == null) {
|
65
|
+
return context.getRuntime().getNil();
|
66
|
+
}
|
64
67
|
return context.getRuntime().newString(java_object.toString());
|
65
68
|
}
|
69
|
+
|
70
|
+
@JRubyMethod
|
71
|
+
public IRubyObject to_i(ThreadContext context) {
|
72
|
+
if (java_object instanceof Long) {
|
73
|
+
return context.getRuntime().newFixnum((Long)java_object);
|
74
|
+
}
|
75
|
+
return context.getRuntime().getNil();
|
76
|
+
}
|
66
77
|
}
|
@@ -18,11 +18,14 @@ import org.jruby.RubyString;
|
|
18
18
|
import org.jruby.RubySymbol;
|
19
19
|
import org.jruby.anno.JRubyMethod;
|
20
20
|
import org.jruby.anno.JRubyModule;
|
21
|
+
import org.jruby.javasupport.util.RuntimeHelpers;
|
21
22
|
import org.jruby.runtime.Block;
|
22
23
|
import org.jruby.runtime.ThreadContext;
|
23
24
|
import org.jruby.runtime.builtin.IRubyObject;
|
24
25
|
|
26
|
+
import clojure.lang.Keyword;
|
25
27
|
import clojure.lang.PersistentHashSet;
|
28
|
+
import clojure.lang.PersistentVector;
|
26
29
|
import datomic.Connection;
|
27
30
|
import datomic.Peer;
|
28
31
|
|
@@ -55,20 +58,26 @@ public class DiametricPeer extends RubyModule {
|
|
55
58
|
DiametricConnection rubyConnection = (DiametricConnection)clazz.allocate();
|
56
59
|
try {
|
57
60
|
// what value will be returned when connect fails? API doc doesn't tell anything.
|
58
|
-
Connection connection = (Connection)
|
61
|
+
Connection connection = (Connection) DiametricService.getFn("datomic.api", "connect").invoke(uriOrMap);
|
59
62
|
rubyConnection.init(connection);
|
60
63
|
saved_connection = rubyConnection;
|
61
64
|
return rubyConnection;
|
62
65
|
} catch (Exception e) {
|
63
66
|
// Diametric doesn't require creating database before connect.
|
64
|
-
if
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
67
|
+
// if database has not yet created, try that first and return the connection
|
68
|
+
if (e instanceof clojure.lang.ExceptionInfo) {
|
69
|
+
try {
|
70
|
+
DiametricService.getFn("datomic.api", "create-database").invoke(uriOrMap);
|
71
|
+
Connection connection = (Connection) DiametricService.getFn("datomic.api", "connect").invoke(uriOrMap);
|
72
|
+
rubyConnection.init(connection);
|
73
|
+
saved_connection = rubyConnection;
|
74
|
+
return rubyConnection;
|
75
|
+
} catch (Throwable t) {
|
76
|
+
throw context.getRuntime().newRuntimeError(t.getMessage());
|
77
|
+
}
|
69
78
|
}
|
79
|
+
throw context.getRuntime().newRuntimeError(e.getMessage());
|
70
80
|
}
|
71
|
-
throw context.getRuntime().newRuntimeError("Failed to create connection");
|
72
81
|
}
|
73
82
|
|
74
83
|
@JRubyMethod(meta=true)
|
@@ -77,7 +86,7 @@ public class DiametricPeer extends RubyModule {
|
|
77
86
|
if (uriOrMap == null)
|
78
87
|
throw context.getRuntime().newArgumentError("Argument should be a String");
|
79
88
|
try {
|
80
|
-
boolean status = (Boolean)
|
89
|
+
boolean status = (Boolean)DiametricService.getFn("datomic.api", "create-database").invoke(uriOrMap);
|
81
90
|
return RubyBoolean.newBoolean(context.getRuntime(), status);
|
82
91
|
} catch (Exception e) {
|
83
92
|
throw context.getRuntime().newRuntimeError("Datomic Error: " + e.getMessage());
|
@@ -92,7 +101,7 @@ public class DiametricPeer extends RubyModule {
|
|
92
101
|
String newName = DiametricUtils.rubyStringToJava(args[1]);
|
93
102
|
if (newName == null) return context.getRuntime().getNil();
|
94
103
|
try {
|
95
|
-
boolean status = (Boolean)
|
104
|
+
boolean status = (Boolean)DiametricService.getFn("datomic.api", "rename-database").invoke(uriOrMap, newName);
|
96
105
|
return RubyBoolean.newBoolean(context.getRuntime(), status);
|
97
106
|
} catch (Exception e) {
|
98
107
|
throw context.getRuntime().newRuntimeError("Datomic Error: " + e.getMessage());
|
@@ -104,7 +113,7 @@ public class DiametricPeer extends RubyModule {
|
|
104
113
|
String uriOrMap = DiametricUtils.rubyStringToJava(arg);
|
105
114
|
if (uriOrMap == null) return context.getRuntime().getNil();
|
106
115
|
try {
|
107
|
-
boolean status = (Boolean)
|
116
|
+
boolean status = (Boolean)DiametricService.getFn("datomic.api", "delete-database").invoke(uriOrMap);
|
108
117
|
return RubyBoolean.newBoolean(context.getRuntime(), status);
|
109
118
|
} catch (Exception e) {
|
110
119
|
throw context.getRuntime().newRuntimeError("Datomic Error: " + e.getMessage());
|
@@ -118,7 +127,7 @@ public class DiametricPeer extends RubyModule {
|
|
118
127
|
}
|
119
128
|
Boolean shutdownClojure = (Boolean) arg.toJava(Boolean.class);
|
120
129
|
try {
|
121
|
-
|
130
|
+
DiametricService.getFn("datomic.api", "shutdown").invoke(shutdownClojure);
|
122
131
|
} catch (Exception e) {
|
123
132
|
throw context.getRuntime().newRuntimeError("Datomic Error: " + e.getMessage());
|
124
133
|
}
|
@@ -137,7 +146,7 @@ public class DiametricPeer extends RubyModule {
|
|
137
146
|
RubyClass clazz = (RubyClass) context.getRuntime().getClassFromPath("Diametric::Persistence::UUID");
|
138
147
|
diametric.DiametricUUID ruby_uuid = (diametric.DiametricUUID)clazz.allocate();
|
139
148
|
try {
|
140
|
-
java.util.UUID java_uuid = (UUID)
|
149
|
+
java.util.UUID java_uuid = (UUID) DiametricService.getFn("datomic.api", "squuid").invoke();
|
141
150
|
ruby_uuid.init(java_uuid);
|
142
151
|
return ruby_uuid;
|
143
152
|
} catch (Throwable t) {
|
@@ -162,7 +171,7 @@ public class DiametricPeer extends RubyModule {
|
|
162
171
|
if (squuid == null) return context.getRuntime().getNil();
|
163
172
|
long value;
|
164
173
|
try {
|
165
|
-
value = (Long)
|
174
|
+
value = (Long) DiametricService.getFn("datomic.api", "squuid-time-millis").invoke(squuid);
|
166
175
|
return RubyFixnum.newFixnum(context.getRuntime(), value);
|
167
176
|
} catch (Throwable t) {
|
168
177
|
throw context.getRuntime().newRuntimeError("Datomic Exception: " + t.getMessage());
|
@@ -184,11 +193,15 @@ public class DiametricPeer extends RubyModule {
|
|
184
193
|
if (args.length < 1 || args.length > 2) {
|
185
194
|
throw context.getRuntime().newArgumentError("Wrong number of arguments");
|
186
195
|
}
|
187
|
-
|
196
|
+
if (!(args[0] instanceof RubySymbol)) {
|
197
|
+
throw context.getRuntime().newArgumentError("The first argument should be a Symbol");
|
198
|
+
}
|
199
|
+
RubyString edn_string = (RubyString)RuntimeHelpers.invoke(context, args[0], "to_s");
|
200
|
+
Keyword partition = Keyword.intern((String)edn_string.asJavaString());
|
188
201
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Object");
|
189
202
|
DiametricObject diametric_object = (DiametricObject)clazz.allocate();
|
190
203
|
try {
|
191
|
-
clojure.lang.Var clj_var =
|
204
|
+
clojure.lang.Var clj_var = DiametricService.getFn("datomic.api", "tempid");
|
192
205
|
if (args.length > 1 && (args[1] instanceof RubyFixnum)) {
|
193
206
|
long idNumber = (Long) args[1].toJava(Long.class);
|
194
207
|
diametric_object.update(clj_var.invoke(partition, idNumber));
|
@@ -224,7 +237,7 @@ public class DiametricPeer extends RubyModule {
|
|
224
237
|
throw context.getRuntime().newArgumentError("Wrong argument type.");
|
225
238
|
}
|
226
239
|
try {
|
227
|
-
Object dbid =
|
240
|
+
Object dbid = DiametricService.getFn("datomic.api", "resolve-tempid")
|
228
241
|
.invoke(map.get(Connection.DB_AFTER), map.get(Connection.TEMPIDS), ruby_object.toJava());
|
229
242
|
ruby_object.update(dbid);
|
230
243
|
return ruby_object;
|
@@ -239,36 +252,44 @@ public class DiametricPeer extends RubyModule {
|
|
239
252
|
if (args.length < 2) {
|
240
253
|
throw runtime.newArgumentError("Wrong number of arguments");
|
241
254
|
}
|
242
|
-
|
243
|
-
|
255
|
+
Object query = null;
|
256
|
+
if (args[0] instanceof RubyArray) {
|
257
|
+
try {
|
258
|
+
query = DiametricUtils.fromRubyArray(context, (RubyArray)args[0]);
|
259
|
+
} catch (Throwable t) {
|
260
|
+
throw runtime.newRuntimeError(t.getMessage());
|
261
|
+
}
|
262
|
+
} else if (args[0] instanceof RubyString) {
|
263
|
+
query = DiametricUtils.rubyStringToJava(args[0]);
|
264
|
+
}
|
265
|
+
if (query == null) {
|
266
|
+
throw runtime.newArgumentError("The first arg should be a query string or array");
|
244
267
|
}
|
268
|
+
//System.out.println("query: " + query.toString());
|
245
269
|
if (!(args[1] instanceof DiametricDatabase)) {
|
246
270
|
throw runtime.newArgumentError("The second arg should be a database.");
|
247
271
|
}
|
248
|
-
String query = (String)args[0].toJava(String.class);
|
249
272
|
Object database = ((DiametricDatabase)args[1]).toJava();
|
250
273
|
|
251
274
|
Collection<List<Object>> results = null;
|
252
275
|
try {
|
253
276
|
if (args.length == 2) {
|
254
|
-
results = (Collection<List<Object>>)
|
277
|
+
results = (Collection<List<Object>>) DiametricService.getFn("datomic.api", "q").invoke(query, database);
|
255
278
|
} else if ((args.length == 3) && (args[2] instanceof RubyArray)) {
|
256
279
|
RubyArray ruby_inputs = (RubyArray)args[2];
|
257
280
|
if (ruby_inputs.getLength() == 0) {
|
258
281
|
results = Peer.q(query, database);
|
259
282
|
} else {
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
}
|
264
|
-
results = (Collection<List<Object>>) clojure.lang.RT.var("datomic.api", "q").invoke(query, database, inputs);
|
283
|
+
PersistentVector clj_args = DiametricUtils.fromRubyArray(context, (RubyArray)ruby_inputs);
|
284
|
+
//System.out.println("query args: " + clj_args.toString());
|
285
|
+
results = (Collection<List<Object>>) DiametricService.getFn("datomic.api", "q").invoke(query, database, clj_args);
|
265
286
|
}
|
266
287
|
} else {
|
267
288
|
Object[] inputs = new Object[args.length-2];
|
268
289
|
for (int i=0; i<inputs.length; i++) {
|
269
290
|
inputs[i] = DiametricUtils.convertRubyToJava(context, args[i+2]);
|
270
291
|
}
|
271
|
-
results = (Collection<List<Object>>)
|
292
|
+
results = (Collection<List<Object>>) DiametricService.getFn("datomic.api", "q").invoke(query, database, inputs);
|
272
293
|
}
|
273
294
|
} catch (Throwable t) {
|
274
295
|
throw runtime.newRuntimeError("Datomic Exception: " + t.getMessage());
|
@@ -348,8 +369,8 @@ public class DiametricPeer extends RubyModule {
|
|
348
369
|
}
|
349
370
|
if (saved_connection == null) throw runtime.newRuntimeError("Connection is not established");
|
350
371
|
try {
|
351
|
-
Object database =
|
352
|
-
Object entity =
|
372
|
+
Object database = DiametricService.getFn("datomic.api", "db").invoke(saved_connection.toJava());
|
373
|
+
Object entity = DiametricService.getFn("datomic.api", "entity").invoke(database, dbid);
|
353
374
|
RubyClass clazz = (RubyClass) context.getRuntime().getClassFromPath("Diametric::Persistence::Entity");
|
354
375
|
DiametricEntity ruby_entity = (DiametricEntity)clazz.allocate();
|
355
376
|
ruby_entity.init(entity);
|
@@ -364,7 +385,7 @@ public class DiametricPeer extends RubyModule {
|
|
364
385
|
Object dbid = DiametricUtils.convertRubyToJava(context, arg);
|
365
386
|
List query = datomic.Util.list((datomic.Util.list(":db.fn/retractEntity", dbid)));
|
366
387
|
try {
|
367
|
-
|
388
|
+
DiametricService.getFn("datomic.api", "transact-async").invoke(saved_connection.toJava(), query);
|
368
389
|
} catch (Throwable t) {
|
369
390
|
throw context.getRuntime().newRuntimeError("Datomic error: " + t.getMessage());
|
370
391
|
}
|
@@ -388,9 +409,9 @@ public class DiametricPeer extends RubyModule {
|
|
388
409
|
Long dbid = (Long)DiametricUtils.convertRubyToJava(context, args[1]);
|
389
410
|
String query_string = (String)args[2].toJava(String.class);
|
390
411
|
try {
|
391
|
-
Object entity =
|
412
|
+
Object entity = DiametricService.getFn("datomic.api", "entity").invoke(database, dbid);
|
392
413
|
clojure.lang.PersistentHashSet set =
|
393
|
-
(PersistentHashSet)
|
414
|
+
(PersistentHashSet) DiametricService.getFn("clojure.core", "get").invoke(entity, query_string);
|
394
415
|
|
395
416
|
if (set == null) {
|
396
417
|
return RubyArray.newEmptyArray(runtime);
|
@@ -36,9 +36,11 @@ public class DiametricService implements BasicLibraryService {
|
|
36
36
|
|
37
37
|
RubyClass diametric_collection = persistence.defineClassUnder("Collection", runtime.getObject(), COLLECTION_ALLOCATOR);
|
38
38
|
diametric_collection.defineAnnotatedMethods(DiametricCollection.class);
|
39
|
+
diametric_collection.includeModule(runtime.getEnumerable());
|
39
40
|
|
40
41
|
RubyClass diametric_set = persistence.defineClassUnder("Set", runtime.getObject(), SET_ALLOCATOR);
|
41
42
|
diametric_set.defineAnnotatedMethods(DiametricSet.class);
|
43
|
+
diametric_set.includeModule(runtime.getEnumerable());
|
42
44
|
|
43
45
|
RubyClass diametric_listenable = persistence.defineClassUnder("ListenableFuture", runtime.getObject(), LISTENABLE_ALLOCATOR);
|
44
46
|
diametric_listenable.defineAnnotatedMethods(DiametricListenableFuture.class);
|