orientdb-time-graph 0.7
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/.gitignore +58 -0
- data/Guardfile +24 -0
- data/LICENSE +21 -0
- data/README.md +221 -0
- data/VERSION +1 -0
- data/bin/console +75 -0
- data/config/boot.rb +119 -0
- data/config/config.yml +8 -0
- data/config/connect.yml +21 -0
- data/lib/init_db.rb +60 -0
- data/lib/orientdb_time_graph.rb +68 -0
- data/lib/setup.rb +40 -0
- data/lib/support.rb +38 -0
- data/lib/time_graph.rb +100 -0
- data/model/e.rb +7 -0
- data/model/tg/day_of.rb +3 -0
- data/model/tg/grid_of.rb +3 -0
- data/model/tg/jahr.rb +22 -0
- data/model/tg/monat.rb +57 -0
- data/model/tg/month_of.rb +0 -0
- data/model/tg/stunde.rb +16 -0
- data/model/tg/tag.rb +63 -0
- data/model/tg/time_base.rb +101 -0
- data/model/tg/time_of.rb +4 -0
- data/model/v.rb +123 -0
- data/orientdb_time_graph.gemspec +25 -0
- metadata +98 -0
data/model/tg/tag.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
#ActiveOrient::Model.orientdb_class name: 'time_base', superclass: 'V'
|
2
|
+
class TG::Tag # < TG::TimeBase
|
3
|
+
def _monat
|
4
|
+
query.nodes :in, via: TG::DAY_OF
|
5
|
+
end
|
6
|
+
|
7
|
+
def die_stunde h
|
8
|
+
h.to_i >0 && h.to_i<31 ? out_tg_time_of[h].in : nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def stunde *key
|
12
|
+
if key.empty?
|
13
|
+
out_tg_time_of.in
|
14
|
+
else
|
15
|
+
key= key.first if key.is_a?(Array) && key.size == 1
|
16
|
+
nodes( :out, via: TG::TIME_OF, where: { value: key } ).execute
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def monat
|
22
|
+
_monat.execute.first
|
23
|
+
# in_tg_day_of.out.first
|
24
|
+
end
|
25
|
+
|
26
|
+
def datum
|
27
|
+
# three queries are fired
|
28
|
+
# todo
|
29
|
+
# formulate a match query providing anythin in just one query
|
30
|
+
m = monat
|
31
|
+
Date.new m.jahr.value, m.value, value # "#{ value}.#{m.value}.#{m.jahr.value}"
|
32
|
+
end
|
33
|
+
|
34
|
+
=begin
|
35
|
+
Fetches the vertex corresponding to the given date
|
36
|
+
|
37
|
+
(optional: executes the provided block on the vertex )
|
38
|
+
|
39
|
+
Example:
|
40
|
+
|
41
|
+
start_date= Date.new(2018,4,25)
|
42
|
+
TG::Tag.fetch( start_date){ |x| x.datum }
|
43
|
+
=> ["25.4.2018"]
|
44
|
+
TG::Tag.fetch( start_date){ |x| x.data_nodes( ML::L_OHLC).map &:to_human }
|
45
|
+
INFO->select expand ( outE('tg_day_of').in[ value = 25 ] ) from
|
46
|
+
( select expand ( outE('tg_month_of').in[ value = 4 ] ) from
|
47
|
+
( select from tg_jahr where value = 2018 ) )
|
48
|
+
INFO->select expand ( outE('ml_l_ohlc').in ) from #82:8927
|
49
|
+
=> ["<Ohlc[161:22]: in: {ML::L_OHLC=>1},
|
50
|
+
close : 3485.83, high : 3500.6, low : 3464.35, open : 3500.6, time : 2018-04-25 00:00:00,
|
51
|
+
trades : 1831, volume : 0, wap : 0.0>"]
|
52
|
+
=end
|
53
|
+
def self.fetch datum , &b # parameter: a date
|
54
|
+
# query_database( "select expand (out_tg_day_of.in[value = #{datum.day}]) from (select expand (out_tg_month_of.in[value = #{datum.month}]) from (select from tg_jahr where value = #{datum.year} ) ) ") &.first
|
55
|
+
q = OrientSupport::OrientQuery.new from: TG::Jahr, where: { value: datum.year }
|
56
|
+
w = OrientSupport::OrientQuery.new from: q
|
57
|
+
w.nodes :out, via: TG::MONTH_OF, where: { value: datum.month }
|
58
|
+
x = OrientSupport::OrientQuery.new from: w
|
59
|
+
x.nodes :out, via: TG::DAY_OF, where: { value: datum.day }
|
60
|
+
x.execute.first
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
class TG::TimeBase # < V
|
2
|
+
|
3
|
+
=begin
|
4
|
+
Searches for specific value records
|
5
|
+
|
6
|
+
Examples
|
7
|
+
Monat[8] --> Array of all August-month-records
|
8
|
+
Jahr[1930 .. 1945]
|
9
|
+
=end
|
10
|
+
def self.[] *key
|
11
|
+
# result = OrientSupport::Array.new( work_on: self,
|
12
|
+
# work_with: db.execute{ "select from #{ref_name} #{db.compose_where( value: key.analyse)}" } )
|
13
|
+
key= key.first if key.is_a?(Array) && key.size == 1
|
14
|
+
q= query.where( value: key).execute(reduce: true)
|
15
|
+
# result= query_database q
|
16
|
+
# result.size == 1 ? result.first : result # return object if only one record is fetched
|
17
|
+
end
|
18
|
+
|
19
|
+
=begin
|
20
|
+
Moves horizontally within the grid
|
21
|
+
i.e
|
22
|
+
the_day = "4.8.2000".to_tg
|
23
|
+
the_day.move(9).datum # => "13.8.2000"
|
24
|
+
the_day.move(-9).datum # => "26.7.2000"
|
25
|
+
=end
|
26
|
+
def move count
|
27
|
+
dir = count <0 ? 'in' : 'out'
|
28
|
+
r= db.execute { "select from ( traverse #{dir}(\"tg_grid_of\") from #{rrid} while $depth <= #{count.abs}) where $depth = #{count.abs} " }
|
29
|
+
if r.size == 1
|
30
|
+
r.first
|
31
|
+
else
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def analyse_key key # :nodoc:
|
38
|
+
|
39
|
+
new_key= if key.first.is_a?(Range)
|
40
|
+
key.first
|
41
|
+
elsif key.size ==1
|
42
|
+
key.first
|
43
|
+
else
|
44
|
+
key
|
45
|
+
end
|
46
|
+
end
|
47
|
+
=begin
|
48
|
+
Get the nearest horizontal neighbours
|
49
|
+
|
50
|
+
Takes one or two parameters.
|
51
|
+
|
52
|
+
(TG::TimeBase.instance).environment: count_of_previous_nodes, count_of_future_nodes
|
53
|
+
|
54
|
+
Default: return the previous and next 10 items
|
55
|
+
|
56
|
+
"22.4.1967".to_tg.environment.datum
|
57
|
+
=> ["12.4.1967", "13.4.1967", "14.4.1967", "15.4.1967", "16.4.1967", "17.4.1967", "18.4.1967", "19.4.1967", "20.4.1967", "21.4.1967", "22.4.1967", "23.4.1967", "24.4.1967", "25.4.1967", "26.4.1967", "27.4.1967", "28.4.1967", "29.4.1967", "30.4.1967", "1.5.1967", "2.5.1967"]
|
58
|
+
|
59
|
+
It returns an OrientSupport::Array of TG::TimeBase-Objects
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
=end
|
64
|
+
|
65
|
+
# def environment previous_items = 10, next_items = nil
|
66
|
+
# next_items = previous_items if next_items.nil? # default : symmetric fetching
|
67
|
+
#
|
68
|
+
# my_query = -> (count) do
|
69
|
+
# dir = count <0 ? 'in' : 'out'
|
70
|
+
# db.execute { "select from ( traverse #{dir}(\"tg_grid_of\") from #{rrid} while $depth <= #{count.abs}) where $depth >=1 " } # don't fetch self and return an Array
|
71
|
+
# end
|
72
|
+
# prev_result = previous_items.zero? ? [] : my_query[ -previous_items.abs ]
|
73
|
+
# next_result = next_items.zero? ? [] : my_query[ next_items.abs ]
|
74
|
+
# # return a collection suitable for further operations
|
75
|
+
# OrientSupport::Array.new work_on: self, work_with: (prev_result.reverse << self | next_result )
|
76
|
+
#
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
|
80
|
+
def environment previous_items = 10, next_items = nil
|
81
|
+
_environment(prevopus_items, next_items).execute
|
82
|
+
end
|
83
|
+
|
84
|
+
def _environment previous_items, next_items = nil
|
85
|
+
q = ->(**p){ OrientSupport::OrientQuery.new **p }
|
86
|
+
|
87
|
+
next_items = previous_items if next_items.nil? # default : symmetric fetching
|
88
|
+
local_var = :a
|
89
|
+
statement = q[]
|
90
|
+
{ in: previous_items , out: next_items}.each do | dir, items|
|
91
|
+
traverse_query = query kind: 'traverse', while: "$depth <= #{items}"
|
92
|
+
traverse_query.nodes dir, via: TG::GRID_OF, expand: false
|
93
|
+
|
94
|
+
statement.let local_var => q[ from: traverse_query, where: '$depth >=1' ]
|
95
|
+
local_var = local_var.succ
|
96
|
+
end
|
97
|
+
statement.let '$c= UNIONALL($a,$b) '
|
98
|
+
statement.expand( '$c') # returns the statement
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
data/model/tg/time_of.rb
ADDED
data/model/v.rb
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
class V
|
2
|
+
|
3
|
+
# If the time_graph is used any Vertex class inherents the methods defined below.
|
4
|
+
#
|
5
|
+
# Thus
|
6
|
+
#
|
7
|
+
# if the vertices are connected via "...grid.." edges, they can be accessed by
|
8
|
+
# * next
|
9
|
+
# * prev
|
10
|
+
# * move( count )
|
11
|
+
# * + (count)
|
12
|
+
# * - (count)
|
13
|
+
#
|
14
|
+
def next
|
15
|
+
nodes( :out, via: /grid/ , expand: true).first
|
16
|
+
end
|
17
|
+
def prev
|
18
|
+
nodes( :in, via: /grid/ , expand: true).first
|
19
|
+
end
|
20
|
+
|
21
|
+
# simplified and specialized form of traverse
|
22
|
+
#
|
23
|
+
# we follow the graph (Direction: out)
|
24
|
+
#
|
25
|
+
# start = "1.1.2000".to_tg.nodes( via: /temp/ ).first
|
26
|
+
# or
|
27
|
+
# start = the_asset.at("1.1.2000")
|
28
|
+
#
|
29
|
+
# start.vector(10)
|
30
|
+
#
|
31
|
+
# start.vector(10, function: :median){"mean" }
|
32
|
+
#
|
33
|
+
# with
|
34
|
+
# function: one of 'eval, min, max, sum abs, decimal, avg, count,mode, median, percentil, variance, stddev'
|
35
|
+
# and a block, specifying the property to work with
|
36
|
+
#
|
37
|
+
def vector length, where: nil, function: nil, start_at: 0
|
38
|
+
dir = length <0 ? :in : :out ;
|
39
|
+
the_vector_query = traverse dir, via: /grid/, depth: length.abs, where: where, execute: false
|
40
|
+
# the_vector_query.while "inE('ml_has_ohlc').out != #{to_tg.rrid} " if to_tg.present? future use
|
41
|
+
t= OrientSupport::OrientQuery.new from: the_vector_query
|
42
|
+
t.where "$depth >= #{start_at}"
|
43
|
+
if block_given?
|
44
|
+
if function.present?
|
45
|
+
t.projection( "#{function}(#{yield})")
|
46
|
+
t.execute{ |result| result.to_a.flatten.last}.first
|
47
|
+
else
|
48
|
+
t.projection yield
|
49
|
+
t.execute{ |result| result.to_a.flatten.last}.compact
|
50
|
+
end
|
51
|
+
else
|
52
|
+
t.execute
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
=begin
|
61
|
+
Moves horizontally within the grid
|
62
|
+
i.e
|
63
|
+
the_day = "4.8.2000".to_tg
|
64
|
+
the_day.move(9).datum # => "13.8.2000"
|
65
|
+
the_day.move(-9).datum # => "26.7.2000"
|
66
|
+
=end
|
67
|
+
def move count
|
68
|
+
dir = count <0 ? :in : :out
|
69
|
+
edge_class = detect_edges( dir, /grid/, expand: false )
|
70
|
+
q1 = OrientSupport::OrientQuery.new( kind: :traverse )
|
71
|
+
.while( " $depth <= #{count.abs}")
|
72
|
+
.from( self )
|
73
|
+
.nodes( dir, via: edge_class, expand: false)
|
74
|
+
|
75
|
+
q2= OrientSupport::OrientQuery.new from: q1, where: "$depth = #{count.abs} "
|
76
|
+
r = query q2
|
77
|
+
|
78
|
+
|
79
|
+
# r= db.execute { "select from ( traverse #{dir}(\"tg_grid_of\") from #{rrid} while $depth <= #{count.abs}) where $depth = #{count.abs} " }
|
80
|
+
if r.size == 1
|
81
|
+
r.first
|
82
|
+
else
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
=begin
|
87
|
+
Get the node (item) grids in the future
|
88
|
+
|
89
|
+
i.e.
|
90
|
+
the_month = TG::Jahr[2000].monat(8).pop
|
91
|
+
the_month.value # -> 8
|
92
|
+
future_month = the_month + 6
|
93
|
+
future_month.value # -> 2
|
94
|
+
=end
|
95
|
+
def move_ item
|
96
|
+
move item
|
97
|
+
end
|
98
|
+
alias :+ :move_
|
99
|
+
=begin
|
100
|
+
Get the node (item) grids in the past
|
101
|
+
|
102
|
+
i.e.
|
103
|
+
the_day = "4.8.2000".to_tg
|
104
|
+
past_day = the_day - 6
|
105
|
+
past_day.datum # => "29.7.2000"
|
106
|
+
=end
|
107
|
+
def move__ item
|
108
|
+
move -item
|
109
|
+
end
|
110
|
+
|
111
|
+
alias :- :move__
|
112
|
+
|
113
|
+
# it is assumed, that any connection to the time-graph is done with an
|
114
|
+
# edge-class containing "has", ie: has_temperature, has_ohlc, has_an_appointment_with
|
115
|
+
def datum
|
116
|
+
nodes( :in, via: /has/ ).first.datum
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
def to_tg
|
121
|
+
nodes( :in, via: /has/ ).first
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "orientdb-time-graph"
|
6
|
+
s.version = File.open('VERSION').read.strip
|
7
|
+
s.authors = ["Hartmut Bischoff"]
|
8
|
+
s.email = ["topofocus@gmail.com"]
|
9
|
+
s.homepage = 'https://github.com/topofocus/orientdb_time_graph'
|
10
|
+
s.licenses = ['MIT']
|
11
|
+
s.summary = 'Implementation of a time graph in active.orient'
|
12
|
+
s.description = ''
|
13
|
+
s.platform = Gem::Platform::RUBY
|
14
|
+
s.required_ruby_version = '>= 2.6'
|
15
|
+
s.date = Time.now.strftime "%Y-%m-%d"
|
16
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
+
s.bindir = "exe"
|
20
|
+
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
|
22
|
+
s.add_development_dependency "bundler"
|
23
|
+
s.add_dependency 'active-orient'
|
24
|
+
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: orientdb-time-graph
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.7'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hartmut Bischoff
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: active-orient
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: ''
|
42
|
+
email:
|
43
|
+
- topofocus@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".gitignore"
|
49
|
+
- Gemfile
|
50
|
+
- Guardfile
|
51
|
+
- LICENSE
|
52
|
+
- README.md
|
53
|
+
- VERSION
|
54
|
+
- bin/console
|
55
|
+
- config/boot.rb
|
56
|
+
- config/config.yml
|
57
|
+
- config/connect.yml
|
58
|
+
- lib/init_db.rb
|
59
|
+
- lib/orientdb_time_graph.rb
|
60
|
+
- lib/setup.rb
|
61
|
+
- lib/support.rb
|
62
|
+
- lib/time_graph.rb
|
63
|
+
- model/e.rb
|
64
|
+
- model/tg/day_of.rb
|
65
|
+
- model/tg/grid_of.rb
|
66
|
+
- model/tg/jahr.rb
|
67
|
+
- model/tg/monat.rb
|
68
|
+
- model/tg/month_of.rb
|
69
|
+
- model/tg/stunde.rb
|
70
|
+
- model/tg/tag.rb
|
71
|
+
- model/tg/time_base.rb
|
72
|
+
- model/tg/time_of.rb
|
73
|
+
- model/v.rb
|
74
|
+
- orientdb_time_graph.gemspec
|
75
|
+
homepage: https://github.com/topofocus/orientdb_time_graph
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
metadata: {}
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '2.6'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubygems_version: 3.0.4
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: Implementation of a time graph in active.orient
|
98
|
+
test_files: []
|