diametric 0.1.2-java → 0.1.3-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- 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-java.gemspec +11 -10
- 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 +147 -75
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e33d2c190cf89818d0e623f7dedffd139c273549
|
4
|
+
data.tar.gz: 77fcb0a54f756308a0dd808d77893e62e4a5f432
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf5983349bf0b1306888758d9e4ae2159a7cb2e6f5fc48383efd14c8c884be66072c586b92f92c6a3cbaf8d25944f70e58d48038973fc5d903055b2db4965768
|
7
|
+
data.tar.gz: dba8bf24716e7aff49b44d4fb65d325a604ace446fb190d57d239ab4c74f55e1cec2b3b2f93e46a6c83c6ef220ece06c5043e1d6893888a5c02d23f184ff7710
|
data/Gemfile
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
source 'https://rubygems.org'
|
4
4
|
|
5
5
|
gem 'edn', '~> 1.0.2'
|
6
|
-
gem 'activesupport', '~> 3.2.
|
7
|
-
gem 'activemodel', '~> 3.2.
|
6
|
+
gem 'activesupport', '~> 3.2.16'
|
7
|
+
gem 'activemodel', '~> 3.2.16'
|
8
8
|
gem 'datomic-client', '~> 0.4.1'
|
9
9
|
gem 'rubyzip', '~> 0.9.9'
|
10
10
|
|
11
11
|
gem 'lock_jar', '~> 0.7.5', :platform => :jruby
|
12
|
-
gem 'jruby-openssl',
|
12
|
+
gem 'jruby-openssl', :platform => :jruby
|
13
13
|
gem 'uuid', '~> 2.3.7'
|
14
14
|
|
15
15
|
gem 'rspec', '~> 2.14.1'
|
data/Jarfile
CHANGED
@@ -1,20 +1,27 @@
|
|
1
|
+
# -*- ruby -*-
|
1
2
|
repository 'http://clojars.org/repo/'
|
2
3
|
repository 'https://repository.jboss.org/nexus/content/groups/public/'
|
3
4
|
repository 'http://files.couchbase.com/maven2/'
|
4
5
|
|
5
|
-
|
6
|
+
if ENV["DATOMIC_VERSION_PATH"] &&
|
7
|
+
!ENV["DATOMIC_VERSION_PATH"].empty?
|
8
|
+
File.exists?(ENV["DATOMIC_VERSION_PATH"])
|
9
|
+
datomic_version_path = ENV["DATOMIC_VERSION_PATH"]
|
10
|
+
else
|
11
|
+
datomic_version_path = File.join(File.dirname(__FILE__), "datomic_version.yml")
|
12
|
+
end
|
13
|
+
|
6
14
|
require 'yaml'
|
7
|
-
datomic_versions = YAML.load(
|
15
|
+
datomic_versions = YAML.load(File.read(datomic_version_path))
|
8
16
|
|
9
17
|
if ENV['DIAMETRIC_ENV'] && (ENV['DIAMETRIC_ENV'] == "pro")
|
18
|
+
artifactId = "datomic-pro"
|
10
19
|
datomic_version = datomic_versions["pro"]
|
11
20
|
else
|
21
|
+
artifactId = "datomic-free"
|
12
22
|
datomic_version = datomic_versions["free"]
|
13
23
|
end
|
14
|
-
version = /(\d|\.)+/.match(datomic_version)[0]
|
15
|
-
datomic_version.slice!(version)
|
16
|
-
artifactId = datomic_version.chop
|
17
24
|
|
18
25
|
group :default, :runtime do
|
19
|
-
jar "com.datomic:#{artifactId}:#{
|
26
|
+
jar "com.datomic:#{artifactId}:#{datomic_version}"
|
20
27
|
end
|
data/LICENSE.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2012 Clinton N. Dreisbach
|
1
|
+
Copyright (c) 2012-2014 Clinton N. Dreisbach
|
2
2
|
|
3
3
|
MIT License
|
4
4
|
|
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -9,38 +9,27 @@ as entities into a Datomic database.
|
|
9
9
|
|
10
10
|
|
11
11
|
Diametric supports both CRuby and JRuby.
|
12
|
-
When
|
13
|
-
|
14
|
-
When
|
15
|
-
|
12
|
+
When Diametric is used on CRuby, Diametric connects to Datomic's REST service.
|
13
|
+
Using Datomic's REST API, Diametric creates scheam/data and makes a queries to Datomic.
|
14
|
+
When Diametric is used on JRuby, both Datomic's REST and Peer services are supported.
|
15
|
+
The core parts of Peer service are implemented using Datomic API.
|
16
16
|
|
17
17
|
|
18
18
|
For Rubyists who are familiar with object oriented programming, Diametric converts:
|
19
19
|
- Ruby model definition to Datomic schema
|
20
20
|
- Creating, saving and updating model data to Datomic transaction data
|
21
21
|
- Ruby query to Datomic's datalog query
|
22
|
+
- Datomic's dbid to model object (depends on the value of resolve option)
|
22
23
|
|
23
24
|
|
24
25
|
The biggest difference between REST and Peer services is available database types.
|
25
|
-
REST service can use memory database only, which means
|
26
|
+
REST service can use memory database only, which means we can't save data in any file
|
27
|
+
as long as using free version.
|
26
28
|
While Peer service can use memory and free version of transactor,
|
27
|
-
which means
|
29
|
+
which means we can save data in a file through Datomic's transactor.
|
28
30
|
Other than that, Peer service has excellent API to use Datomic's various features.
|
29
31
|
|
30
32
|
|
31
|
-
## Documents
|
32
|
-
|
33
|
-
Other than highlights below, there are documents on Wiki.
|
34
|
-
|
35
|
-
- [Entity API](https://github.com/relevance/diametric/wiki/Entity-API)
|
36
|
-
- [Query API](https://github.com/relevance/diametric/wiki/Query-API)
|
37
|
-
- [Persistence API](https://github.com/relevance/diametric/wiki/Persistence-API)
|
38
|
-
- [Rails Integration](https://github.com/relevance/diametric/wiki/Rails-Integration-%28Experimental%29)
|
39
|
-
- [Seattle Example](https://github.com/relevance/diametric/wiki/Seattle-Example)
|
40
|
-
|
41
|
-
|
42
|
-
This document shows how to use Diametric with simple examples.
|
43
|
-
|
44
33
|
## Installation
|
45
34
|
|
46
35
|
```bash
|
@@ -48,7 +37,7 @@ gem install diametric
|
|
48
37
|
```
|
49
38
|
|
50
39
|
Diametric is a multi-platoform gem. On CRuby, above installs CRuby version of gem.
|
51
|
-
On JRuby,
|
40
|
+
On JRuby, above installed JRuby version of gem with Java extension.
|
52
41
|
|
53
42
|
|
54
43
|
[note]
|
@@ -78,14 +67,14 @@ To learn more about the options in the above command, please go to [http://docs.
|
|
78
67
|
Once the REST server starts running, go to [localhost:9000](localhost:9000) on your browser.
|
79
68
|
You can see Datomic's REST service is running.
|
80
69
|
|
81
|
-
Alternatively, you can download Datomic archive from [
|
70
|
+
Alternatively, you can download Datomic archive from [https://my.datomic.com/downloads/free](https://my.datomic.com/downloads/free),
|
82
71
|
and start REST server using Datomic command, `script/datomic-rest -p 9000 free datomic:mem://`
|
83
72
|
|
84
73
|
|
85
74
|
## Preparation for JRuby
|
86
75
|
|
87
|
-
You have 2 choices on JRuby, Peer and REST
|
88
|
-
Peer service works on the same JVM as JRuby and
|
76
|
+
You have 2 choices on JRuby, Peer and REST services.
|
77
|
+
Peer service works on the same JVM as JRuby and looks like just a Java library for JRuby.
|
89
78
|
|
90
79
|
|
91
80
|
When you choose REST service, follow *Preparation for CRuby* section.
|
@@ -612,7 +601,7 @@ Breeze likes #<Set: {"chocolate", "afternoon", "biking"}>
|
|
612
601
|
```
|
613
602
|
The order is not guaranteed.
|
614
603
|
|
615
|
-
## Association
|
604
|
+
## Association
|
616
605
|
|
617
606
|
On Datomic, association is fairly easy even though it is one to many or many to many.
|
618
607
|
Association is defined by `Ref` type.
|
@@ -678,6 +667,45 @@ Somebody.reify(me.kids.first.mom).name
|
|
678
667
|
=> "Alice Wonderland"
|
679
668
|
```
|
680
669
|
|
670
|
+
## Datomic Verion
|
671
|
+
|
672
|
+
Diametric sets up the default Datomic version.
|
673
|
+
On that version, all Daimetric's tests passes.
|
674
|
+
However, Datomic team frequently releases a new version.
|
675
|
+
Just to update Datomic version, Diametric won't make a new release.
|
676
|
+
From version 0.1.3, Diametric supports user defined Datomic version.
|
677
|
+
|
678
|
+
Here is how a user can use a newer version of Datomic.
|
679
|
+
|
680
|
+
|
681
|
+
Specify a datomic version file by `ENV["DATOMIC_VERSION_PATH"]` *before* `require 'diametric'`.
|
682
|
+
|
683
|
+
For example:
|
684
|
+
```ruby
|
685
|
+
ENV["DATOMIC_VERSION_PATH"] = File.expand_path(File.join(File.dirname(__FILE__), "..", "datomic_version.yml"))
|
686
|
+
require 'diametric'
|
687
|
+
```
|
688
|
+
|
689
|
+
The format of datomic version file is simple yaml. For example:
|
690
|
+
```ruby
|
691
|
+
free:
|
692
|
+
0.9.4532
|
693
|
+
pro:
|
694
|
+
0.9.4470
|
695
|
+
```
|
696
|
+
|
697
|
+
## Other Documents
|
698
|
+
|
699
|
+
More than highlights above, there are documents on Wiki.
|
700
|
+
|
701
|
+
- [Entity API](https://github.com/relevance/diametric/wiki/Entity-API)
|
702
|
+
- [Query API](https://github.com/relevance/diametric/wiki/Query-API)
|
703
|
+
- [Persistence API](https://github.com/relevance/diametric/wiki/Persistence-API)
|
704
|
+
- [Rails Integration](https://github.com/relevance/diametric/wiki/Rails-Integration-%28Experimental%29)
|
705
|
+
- [Seattle Example](https://github.com/relevance/diametric/wiki/Seattle-Example)
|
706
|
+
|
707
|
+
|
708
|
+
|
681
709
|
## Thanks
|
682
710
|
|
683
711
|
Development of Diametric was sponsored by [Relevance][]. They are the
|
@@ -696,7 +724,9 @@ Special thanks to Mongoid for writing some solid ORM code that was liberally bor
|
|
696
724
|
|
697
725
|
## License
|
698
726
|
|
699
|
-
This project uses the [
|
727
|
+
This project uses the [MIT License][].
|
728
|
+
|
729
|
+
When this project is used, a user is considered agreed to the [Datomic Free Edition License][].
|
700
730
|
|
701
731
|
Copyright (c) 2012, Clinton Dreisbach & Relevance Inc. All rights reserved.
|
702
732
|
|
@@ -709,4 +739,5 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
709
739
|
|
710
740
|
[Datomic]: http://www.datomic.com
|
711
741
|
[Relevance]: http://www.thinkrelevance.com
|
712
|
-
[
|
742
|
+
[MIT License]: http://opensource.org/licenses/MIT
|
743
|
+
[Datomic Free Edition License]: https://my.datomic.com/downloads/free
|
data/Rakefile
CHANGED
data/bin/datomic-rest
CHANGED
@@ -23,7 +23,7 @@ opts = OptionParser.new do |opts|
|
|
23
23
|
end
|
24
24
|
opts.parse!
|
25
25
|
|
26
|
-
DATOMIC_NAME = File.read(File.join(File.dirname(__FILE__), "..", "datomic_version.
|
26
|
+
DATOMIC_NAME = File.read(File.join(File.dirname(__FILE__), "..", "datomic_version.yml"))
|
27
27
|
|
28
28
|
require 'diametric/rest_service'
|
29
29
|
|
data/bin/download-datomic
CHANGED
data/datomic_version.yml
CHANGED
data/diametric-java.gemspec
CHANGED
@@ -8,6 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.name = "diametric"
|
9
9
|
gem.version = Diametric::VERSION
|
10
10
|
gem.authors = ["Clinton N. Dreisbach", "Ryan K. Neufeld", "Yoko Harada"]
|
11
|
+
gem.license = 'MIT'
|
11
12
|
gem.email = ["crnixon@gmail.com", "ryan@thinkrelevance.com", "yoko@thinkrelevance.com"]
|
12
13
|
gem.summary = %q{ActiveModel for Datomic (JRuby)}
|
13
14
|
gem.description = <<EOF
|
@@ -24,16 +25,16 @@ EOF
|
|
24
25
|
gem.require_paths = ["lib"]
|
25
26
|
gem.executables = ["datomic-rest", "download-datomic"]
|
26
27
|
|
27
|
-
gem.add_dependency 'edn', '~> 1.0.2'
|
28
|
-
gem.add_dependency 'activesupport', '~> 3.2.
|
29
|
-
gem.add_dependency 'activemodel', '~> 3.2.
|
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'
|
28
|
+
gem.add_dependency 'edn', '~> 1.0', '>= 1.0.2'
|
29
|
+
gem.add_dependency 'activesupport', '~> 3.2', '>= 3.2.16'
|
30
|
+
gem.add_dependency 'activemodel', '~> 3.2', '>= 3.2.16'
|
31
|
+
gem.add_dependency 'datomic-client', '~> 0.4', '>= 0.4.1'
|
32
|
+
gem.add_dependency 'rubyzip', '~> 0.9', '>= 0.9.9'
|
33
|
+
gem.add_dependency 'lock_jar', '~> 0.7', '>= 0.7.5'
|
34
|
+
gem.add_dependency 'jruby-openssl', '~> 0.8', '>= 0.8.8'
|
35
|
+
gem.add_dependency 'uuid', '~> 2.3', '>= 2.3.7'
|
36
|
+
gem.add_dependency 'rspec', '~> 2.14', '>= 2.14.1'
|
37
|
+
gem.add_dependency 'rake-compiler', '~> 0.9', '>= 0.9.1'
|
37
38
|
|
38
39
|
gem.extensions = ['Rakefile']
|
39
40
|
end
|
@@ -32,6 +32,13 @@ public class DiametricCollection extends RubyObject {
|
|
32
32
|
private Integer count = null; // unable to count the vector size that exceeds Integer
|
33
33
|
private DiametricCommon common = null;
|
34
34
|
|
35
|
+
static IRubyObject getDiametricCollection(ThreadContext context, List value) {
|
36
|
+
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Collection");
|
37
|
+
DiametricCollection diametric_collection = (DiametricCollection)clazz.allocate();
|
38
|
+
diametric_collection.init((List)value);
|
39
|
+
return diametric_collection;
|
40
|
+
}
|
41
|
+
|
35
42
|
public DiametricCollection(Ruby runtime, RubyClass klazz) {
|
36
43
|
super(runtime, klazz);
|
37
44
|
}
|
@@ -56,7 +63,7 @@ public class DiametricCollection extends RubyObject {
|
|
56
63
|
try {
|
57
64
|
clojure.lang.PersistentVector value =
|
58
65
|
(clojure.lang.PersistentVector)arg.toJava(clojure.lang.PersistentVector.class);
|
59
|
-
return
|
66
|
+
return DiametricCollection.getDiametricCollection(context, (List)value);
|
60
67
|
} catch (Throwable t) {
|
61
68
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
62
69
|
}
|
@@ -69,7 +76,7 @@ public class DiametricCollection extends RubyObject {
|
|
69
76
|
(clojure.lang.PersistentVector)arg.toJava(clojure.lang.PersistentVector.class);
|
70
77
|
Var var = DiametricService.getFn("clojure.core", "take");
|
71
78
|
Object value = var.invoke(100, v);
|
72
|
-
return
|
79
|
+
return DiametricCollection.getDiametricCollection(context, (List)value);
|
73
80
|
} catch (Throwable t) {
|
74
81
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
75
82
|
}
|
@@ -91,21 +98,21 @@ public class DiametricCollection extends RubyObject {
|
|
91
98
|
throw context.getRuntime().newRuntimeError("argument should be array");
|
92
99
|
}
|
93
100
|
List other = (List)arg;
|
94
|
-
Var two_arrays_diff_fn = null;
|
95
|
-
if (DiametricService.fnMap.containsKey("two-arrays-diff")) {
|
96
|
-
two_arrays_diff_fn = DiametricService.fnMap.get("two-arrays-diff");
|
97
|
-
} else {
|
98
|
-
Var var = DiametricService.getFn("clojure.core", "load-string");
|
99
|
-
String fn =
|
100
|
-
"(defn two-arrays-diff [this other]\n" +
|
101
|
-
" (let [f (fn [ary n] (remove (partial = n) ary))]\n"+
|
102
|
-
" (reduce f this other)))";
|
103
|
-
two_arrays_diff_fn = (Var)var.invoke(fn);
|
104
|
-
DiametricService.fnMap.put("two-arrays-diff", two_arrays_diff_fn);
|
105
|
-
}
|
106
101
|
try {
|
102
|
+
Var two_arrays_diff_fn = null;
|
103
|
+
if (DiametricService.fnMap.containsKey("two-arrays-diff")) {
|
104
|
+
two_arrays_diff_fn = DiametricService.fnMap.get("two-arrays-diff");
|
105
|
+
} else {
|
106
|
+
Var var = DiametricService.getFn("clojure.core", "load-string");
|
107
|
+
String fn =
|
108
|
+
"(defn two-arrays-diff [this other]\n" +
|
109
|
+
" (let [f (fn [ary n] (remove (partial = n) ary))]\n"+
|
110
|
+
" (reduce f this other)))";
|
111
|
+
two_arrays_diff_fn = (Var)var.invoke(fn);
|
112
|
+
DiametricService.fnMap.put("two-arrays-diff", two_arrays_diff_fn);
|
113
|
+
}
|
107
114
|
Object value = two_arrays_diff_fn.invoke(vector_or_seq, other);
|
108
|
-
return
|
115
|
+
return DiametricCollection.getDiametricCollection(context, (List)value);
|
109
116
|
} catch (Throwable t) {
|
110
117
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
111
118
|
}
|
@@ -114,18 +121,18 @@ public class DiametricCollection extends RubyObject {
|
|
114
121
|
@JRubyMethod(name="*")
|
115
122
|
public IRubyObject op_times(ThreadContext context, IRubyObject arg) {
|
116
123
|
if (arg instanceof RubyFixnum) {
|
117
|
-
Var append_n_times_fn = null;
|
118
|
-
if (DiametricService.fnMap.containsKey("append-n-times")) {
|
119
|
-
append_n_times_fn = DiametricService.fnMap.get("append-n-times");
|
120
|
-
} else {
|
121
|
-
Var var = DiametricService.getFn("clojure.core", "load-string");
|
122
|
-
append_n_times_fn = (Var)var.invoke("(defn append-n-times [n array] (reduce concat (replicate n array)))");
|
123
|
-
DiametricService.fnMap.put("append-n-times", append_n_times_fn);
|
124
|
-
}
|
125
|
-
Integer n = (Integer)arg.toJava(Integer.class);
|
126
124
|
try {
|
125
|
+
Var append_n_times_fn = null;
|
126
|
+
if (DiametricService.fnMap.containsKey("append-n-times")) {
|
127
|
+
append_n_times_fn = DiametricService.fnMap.get("append-n-times");
|
128
|
+
} else {
|
129
|
+
Var var = DiametricService.getFn("clojure.core", "load-string");
|
130
|
+
append_n_times_fn = (Var)var.invoke("(defn append-n-times [n array] (reduce concat (replicate n array)))");
|
131
|
+
DiametricService.fnMap.put("append-n-times", append_n_times_fn);
|
132
|
+
}
|
133
|
+
Integer n = (Integer)arg.toJava(Integer.class);
|
127
134
|
Object value = append_n_times_fn.invoke(n, vector_or_seq);
|
128
|
-
return
|
135
|
+
return DiametricCollection.getDiametricCollection(context, (List)value);
|
129
136
|
} catch (Throwable t) {
|
130
137
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
131
138
|
}
|
@@ -145,7 +152,7 @@ public class DiametricCollection extends RubyObject {
|
|
145
152
|
try {
|
146
153
|
Var var = DiametricService.getFn("clojure.core", "concat");
|
147
154
|
Object value = var.invoke(vector_or_seq, other);
|
148
|
-
return
|
155
|
+
return DiametricCollection.getDiametricCollection(context, (List)value);
|
149
156
|
} catch (Throwable t) {
|
150
157
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
151
158
|
}
|
@@ -196,8 +203,8 @@ public class DiametricCollection extends RubyObject {
|
|
196
203
|
return commonArefIndex(context, index);
|
197
204
|
} else if (index_or_range instanceof RubyRange) {
|
198
205
|
RubyRange range = (RubyRange)index_or_range;
|
199
|
-
Long start = (Long)range.first().toJava(Long.class);
|
200
|
-
Long last = (Long)range.last().toJava(Long.class);
|
206
|
+
Long start = (Long)range.first(context).toJava(Long.class);
|
207
|
+
Long last = (Long)range.last(context).toJava(Long.class);
|
201
208
|
// subvec returns from 'start' to element (- end 1)
|
202
209
|
if (range.exclude_end_p().isTrue()) {
|
203
210
|
return commonAref(context, start, null, last);
|
@@ -255,7 +262,7 @@ public class DiametricCollection extends RubyObject {
|
|
255
262
|
if (length == null) length = last - start;
|
256
263
|
value = commonArefByDropTake(start, length);
|
257
264
|
}
|
258
|
-
return
|
265
|
+
return DiametricCollection.getDiametricCollection(context, (List)value);
|
259
266
|
} catch (Throwable t) {
|
260
267
|
if (t instanceof IndexOutOfBoundsException) {
|
261
268
|
return retryAref(context, start, length, last);
|
@@ -621,16 +628,16 @@ public class DiametricCollection extends RubyObject {
|
|
621
628
|
|
622
629
|
@JRubyMethod(name="include?")
|
623
630
|
public IRubyObject include_p(ThreadContext context, IRubyObject arg) {
|
624
|
-
Var include_p_fn = null;
|
625
|
-
if (DiametricService.fnMap.containsKey("include?")) {
|
626
|
-
include_p_fn = DiametricService.fnMap.get("include?");
|
627
|
-
} else {
|
628
|
-
Var var = DiametricService.getFn("clojure.core", "load-string");
|
629
|
-
include_p_fn = (Var)var.invoke("(defn include? [v array] (some (partial = v) array))");
|
630
|
-
DiametricService.fnMap.put("include?", include_p_fn);
|
631
|
-
}
|
632
|
-
Object java_object = DiametricUtils.convertRubyToJava(context, arg);
|
633
631
|
try {
|
632
|
+
Var include_p_fn = null;
|
633
|
+
if (DiametricService.fnMap.containsKey("include?")) {
|
634
|
+
include_p_fn = DiametricService.fnMap.get("include?");
|
635
|
+
} else {
|
636
|
+
Var var = DiametricService.getFn("clojure.core", "load-string");
|
637
|
+
include_p_fn = (Var)var.invoke("(defn include? [v array] (some (partial = v) array))");
|
638
|
+
DiametricService.fnMap.put("include?", include_p_fn);
|
639
|
+
}
|
640
|
+
Object java_object = DiametricUtils.convertRubyToJava(context, arg);
|
634
641
|
Object result = include_p_fn.invoke(java_object, vector_or_seq);
|
635
642
|
if ((result instanceof Boolean) && (Boolean)result) {
|
636
643
|
return context.getRuntime().getTrue();
|
@@ -40,7 +40,7 @@ public class DiametricConnection extends RubyObject {
|
|
40
40
|
@JRubyMethod
|
41
41
|
public IRubyObject db(ThreadContext context) {
|
42
42
|
try {
|
43
|
-
Object database =
|
43
|
+
Object database = DiametricService.getFn("datomic.api", "db").invoke(conn);
|
44
44
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::Database");
|
45
45
|
DiametricDatabase diametric_database = (DiametricDatabase)clazz.allocate();
|
46
46
|
diametric_database.init(database);
|
@@ -52,13 +52,14 @@ public class DiametricConnection extends RubyObject {
|
|
52
52
|
|
53
53
|
@JRubyMethod
|
54
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
55
|
try {
|
61
|
-
Object
|
56
|
+
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg); // may raise exception
|
57
|
+
if (tx_data == null) {
|
58
|
+
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
59
|
+
}
|
60
|
+
|
61
|
+
//System.out.println("tx_data: " + tx_data.toString() + " class: " + tx_data.getClass().getCanonicalName());
|
62
|
+
Object future = DiametricService.getFn("datomic.api", "transact").invoke(conn, tx_data);
|
62
63
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::ListenableFuture");
|
63
64
|
DiametricListenableFuture diametric_listenable = (DiametricListenableFuture)clazz.allocate();
|
64
65
|
diametric_listenable.init(future);
|
@@ -70,13 +71,13 @@ public class DiametricConnection extends RubyObject {
|
|
70
71
|
|
71
72
|
@JRubyMethod
|
72
73
|
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
74
|
try {
|
79
|
-
Object
|
75
|
+
List<Object> tx_data = DiametricUtils.convertRubyTxDataToJava(context, arg); // my raise exception
|
76
|
+
if (tx_data == null) {
|
77
|
+
throw context.getRuntime().newArgumentError("Argument should be Array or clojure.lang.PersistentVector");
|
78
|
+
}
|
79
|
+
|
80
|
+
Object future = DiametricService.getFn("datomic.api", "transact-async").invoke(conn, tx_data);
|
80
81
|
RubyClass clazz = (RubyClass)context.getRuntime().getClassFromPath("Diametric::Persistence::ListenableFuture");
|
81
82
|
DiametricListenableFuture diametric_listenable = (DiametricListenableFuture)clazz.allocate();
|
82
83
|
diametric_listenable.init(future);
|
@@ -94,7 +95,7 @@ public class DiametricConnection extends RubyObject {
|
|
94
95
|
RubyTime rubyTime = (RubyTime) RuntimeHelpers.invoke(context, arg, "to_time");
|
95
96
|
Date olderThan = rubyTime.getJavaDate();
|
96
97
|
try {
|
97
|
-
|
98
|
+
DiametricService.getFn("datomic.api", "gc-strage").invoke(conn, olderThan);
|
98
99
|
} catch (Throwable t) {
|
99
100
|
throw context.getRuntime().newRuntimeError("Datomic error: " + t.getMessage());
|
100
101
|
}
|
@@ -104,7 +105,7 @@ public class DiametricConnection extends RubyObject {
|
|
104
105
|
@JRubyMethod
|
105
106
|
public IRubyObject release(ThreadContext context) {
|
106
107
|
try {
|
107
|
-
|
108
|
+
DiametricService.getFn("datomic.api", "release").invoke(conn);
|
108
109
|
} catch (Throwable t) {
|
109
110
|
throw context.getRuntime().newRuntimeError(t.getMessage());
|
110
111
|
}
|