swift_db 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +13 -0
- data/README.rdoc +0 -0
- data/Rakefile +14 -0
- data/lib/a.rb +0 -0
- data/lib/common/comparison.rb +14 -0
- data/lib/db.rb +20 -0
- data/lib/root/binary.rb +7 -0
- data/lib/root/internal_node.rb +97 -0
- data/lib/root/leaf.rb +9 -0
- data/lib/root/table.rb +32 -0
- data/lib/root/tree.rb +115 -0
- data/lib/swift_db.rb +12 -0
- data/swift_db.gemspec +30 -0
- metadata +94 -0
data/Manifest
ADDED
data/README.rdoc
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('swift_db', '0.1.1') do |p|
|
6
|
+
p.description = "Stores data in a B+tree structure"
|
7
|
+
p.url = "https://github.com/ask4prasath/swift_db"
|
8
|
+
p.author = "Prasath V Ram"
|
9
|
+
p.email = "ask4prasath@gmail.com"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
data/lib/a.rb
ADDED
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DB
|
2
|
+
module Core
|
3
|
+
module Common
|
4
|
+
module Comparison
|
5
|
+
EQ = "==" # Equal
|
6
|
+
NEQ = "<>" # Not equal
|
7
|
+
GT = ">" # Greater than
|
8
|
+
GTE = ">=" # Greater than or equal
|
9
|
+
LT = "<" # Less than
|
10
|
+
LTE = "<=" # Less than or equal
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/db.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__),'..','lib'))
|
2
|
+
|
3
|
+
#Loads all the core Database Files
|
4
|
+
|
5
|
+
#require "/home/prasath/database/Database/lib/root/leaf.rb"
|
6
|
+
|
7
|
+
require "root/tree.rb"
|
8
|
+
require "root/leaf.rb"
|
9
|
+
require "root/internal_node.rb"
|
10
|
+
require "root/binary.rb"
|
11
|
+
require "root/table.rb"
|
12
|
+
require "common/comparison.rb"
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
#for local reference
|
18
|
+
|
19
|
+
#require "/home/prasath/database/Database/lib/db.rb"
|
20
|
+
#a = Db::Core::Table.new
|
data/lib/root/binary.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
module Db
|
2
|
+
module Core
|
3
|
+
class InternalNode
|
4
|
+
attr_reader :infinity_node, :keys_and_node_pointers
|
5
|
+
attr_accessor :parent_node
|
6
|
+
|
7
|
+
def initialize(order=3, infinity_node=nil)
|
8
|
+
@order=order
|
9
|
+
@max_capacity=@order-1
|
10
|
+
@keys_and_node_pointers=[]
|
11
|
+
@infinity_node=infinity_node
|
12
|
+
@infinity_node.parent_node=self
|
13
|
+
@parent_node=nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def keys
|
17
|
+
keys=[]
|
18
|
+
@keys_and_node_pointers.each {|key_data| keys << key_data[0]}
|
19
|
+
keys
|
20
|
+
end
|
21
|
+
|
22
|
+
def datas
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def max_key_value
|
28
|
+
@keys_and_node_pointers[-1][0]
|
29
|
+
end
|
30
|
+
|
31
|
+
def insert_node_pointer(key_and_node)
|
32
|
+
puts "-------------#{key_and_node}"
|
33
|
+
@keys_and_node_pointers << key_and_node
|
34
|
+
sort_keys
|
35
|
+
split if @keys_and_node_pointers.size > @max_capacity
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def insert(key, value)
|
40
|
+
case
|
41
|
+
when key > max_key_value
|
42
|
+
@infinity_node.insert(key, value)
|
43
|
+
else
|
44
|
+
@keys_and_node_pointers.each do |key_node|
|
45
|
+
if key <= key_node[0]
|
46
|
+
key_node[1].insert(key, value)
|
47
|
+
break;
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def search(key, operator=DB::Core::Common::Comparison::EQ)
|
54
|
+
match=nil
|
55
|
+
case
|
56
|
+
when key > max_key_value
|
57
|
+
match=@infinity_node.search(key, operator)
|
58
|
+
else
|
59
|
+
@keys_and_node_pointers.each do |key_node|
|
60
|
+
if key <= key_node[0]
|
61
|
+
match=key_node[1].search(key, operator)
|
62
|
+
break;
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
return match
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def sort_keys
|
73
|
+
@keys_and_node_pointers.sort! {|a,b| a<=>b}
|
74
|
+
end
|
75
|
+
|
76
|
+
def split
|
77
|
+
puts "============#{@keys_and_node_pointers}"
|
78
|
+
split_index=((@keys_and_node_pointers.length / @max_capacity.to_f).ceil)-1
|
79
|
+
splited_values=@keys_and_node_pointers.values_at(0..split_index)
|
80
|
+
@keys_and_node_pointers.slice!(0..split_index)
|
81
|
+
|
82
|
+
max_key_node = splited_values[-1]
|
83
|
+
|
84
|
+
new_node=InternalNode.new(@order, max_key_node[1])
|
85
|
+
|
86
|
+
@parent_node = InternalNode.new(@order, self) if @parent_node.nil?
|
87
|
+
new_node.parent_node=@parent_node
|
88
|
+
|
89
|
+
splited_values.slice!(-1)
|
90
|
+
splited_values.each {|key_node| new_node.insert_node_pointer(key_node) }
|
91
|
+
|
92
|
+
@parent_node.insert_node_pointer([max_key_node[0], new_node])
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/root/leaf.rb
ADDED
data/lib/root/table.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Db
|
2
|
+
module Core
|
3
|
+
class Table
|
4
|
+
|
5
|
+
attr_accessor :root_node, :first_node
|
6
|
+
|
7
|
+
def initialize(structure=3)
|
8
|
+
raise "Your node structure is less than 3 which is not good for BTree" if (structure < 3)
|
9
|
+
@structure = structure
|
10
|
+
@root_node = Tree.new(@structure)
|
11
|
+
@first_node = @root_node
|
12
|
+
end
|
13
|
+
|
14
|
+
def insert(key, value)
|
15
|
+
@root_node.insert(key, value)
|
16
|
+
@root_node = @root_node.parent_node unless @root_node.parent_node.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def search(key, operator=DB::Core::Common::Comparison::EQ)
|
20
|
+
case operator
|
21
|
+
when DB::Core::Common::Comparison::NEQ
|
22
|
+
@root_node.search(key, DB::Core::Common::Comparison::LT) + @root_node.search(key, DB::Core::Common::Comparison::GT)
|
23
|
+
else
|
24
|
+
@root_node.search(key, operator)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/root/tree.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
module Db
|
2
|
+
module Core
|
3
|
+
class Tree
|
4
|
+
|
5
|
+
attr_accessor :datas, :parent_node, :pre_node, :next_node, :structure
|
6
|
+
|
7
|
+
def initialize(structure=3)
|
8
|
+
@structure = structure
|
9
|
+
@datas = []
|
10
|
+
@parent_node = nil
|
11
|
+
@pre_node = nil
|
12
|
+
@leaf_node = nil
|
13
|
+
@next_node = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def keys
|
17
|
+
id = []
|
18
|
+
@datas.each {|k| id << k[0]}
|
19
|
+
id
|
20
|
+
end
|
21
|
+
|
22
|
+
def max_key_value
|
23
|
+
@datas[-1][0]
|
24
|
+
end
|
25
|
+
|
26
|
+
def insert(key, value)
|
27
|
+
inserting_element = key
|
28
|
+
_datas = [] << inserting_element << value
|
29
|
+
@datas << _datas
|
30
|
+
sort_keys
|
31
|
+
divide if @datas.length > @structure
|
32
|
+
@datas
|
33
|
+
end
|
34
|
+
|
35
|
+
def search(key, operator=DB::Core::Common::Comparison::EQ)
|
36
|
+
match=[]
|
37
|
+
case operator
|
38
|
+
when DB::Core::Common::Comparison::EQ
|
39
|
+
@datas.each do |key_node|
|
40
|
+
if key == key_node[0]
|
41
|
+
match << key_node[1]
|
42
|
+
break;
|
43
|
+
end
|
44
|
+
end
|
45
|
+
return match[0]
|
46
|
+
when DB::Core::Common::Comparison::GT ## Find nodes that are greater than key
|
47
|
+
@datas.each do |key_node|
|
48
|
+
if key_node[0] > key
|
49
|
+
match << key_node[1]
|
50
|
+
end
|
51
|
+
end if max_key_value > key
|
52
|
+
match += next_node.search(key, operator) unless next_node.nil?
|
53
|
+
return match
|
54
|
+
when DB::Core::Common::Comparison::GTE
|
55
|
+
@datas.each do |key_node|
|
56
|
+
if key_node[0] >= key
|
57
|
+
match << key_node[1]
|
58
|
+
end
|
59
|
+
end if max_key_value >= key
|
60
|
+
match += next_node.search(key, operator) unless next_node.nil?
|
61
|
+
return match
|
62
|
+
when DB::Core::Common::Comparison::LT
|
63
|
+
@datas.each do |key_node|
|
64
|
+
if key_node[0] < key
|
65
|
+
match << key_node[1]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
pre_match = []
|
69
|
+
pre_match = pre_node.search(key, operator) unless pre_node.nil?
|
70
|
+
match = pre_match + match
|
71
|
+
return match
|
72
|
+
when DB::Core::Common::Comparison::LTE
|
73
|
+
@datas.each do |key_node|
|
74
|
+
if key_node[0] <= key
|
75
|
+
match << key_node[1]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
pre_match = []
|
79
|
+
pre_match = pre_node.search(key, operator) unless pre_node.nil?
|
80
|
+
match = pre_match + match
|
81
|
+
return match
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
private
|
87
|
+
def sort_keys
|
88
|
+
self.datas.sort!
|
89
|
+
end
|
90
|
+
|
91
|
+
def divide
|
92
|
+
no_of_divides = ((@datas.length/@structure).ceil) - 1
|
93
|
+
leaf_items = @datas.values_at(0..no_of_divides)
|
94
|
+
@datas.slice!(0..no_of_divides)
|
95
|
+
|
96
|
+
|
97
|
+
new_node = Tree.new()
|
98
|
+
new_node.datas = leaf_items
|
99
|
+
new_node.pre_node = @pre_node
|
100
|
+
new_node.next_node = self
|
101
|
+
new_node.pre_node.next_node = new_node unless new_node.pre_node.nil?
|
102
|
+
@pre_node = new_node
|
103
|
+
@parent_node = InternalNode.new(@structure, self) if @parent_node.nil?
|
104
|
+
@pre_node.parent_node=@parent_node
|
105
|
+
@parent_node.insert_node_pointer([@pre_node.max_key_value, @pre_node]) unless @parent_node.nil?
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
#require "/home/prasath/database/Database/lib/db.rb"
|
115
|
+
#a= Db::Core::Tree.new
|
data/lib/swift_db.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__),'..','lib'))
|
2
|
+
|
3
|
+
#Loads all the core Database Files
|
4
|
+
|
5
|
+
#require "/home/prasath/database/Database/lib/root/leaf.rb"
|
6
|
+
|
7
|
+
require "root/tree.rb"
|
8
|
+
require "root/leaf.rb"
|
9
|
+
require "root/internal_node.rb"
|
10
|
+
require "root/binary.rb"
|
11
|
+
require "root/table.rb"
|
12
|
+
require "common/comparison.rb"
|
data/swift_db.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{swift_db}
|
5
|
+
s.version = "0.1.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Prasath V Ram"]
|
9
|
+
s.date = %q{2010-12-05}
|
10
|
+
s.description = %q{Stores data in a B+tree structure}
|
11
|
+
s.email = %q{ask4prasath@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["README.rdoc", "lib/a.rb", "lib/common/comparison.rb", "lib/db.rb", "lib/root/binary.rb", "lib/root/internal_node.rb", "lib/root/leaf.rb", "lib/root/table.rb", "lib/root/tree.rb", "lib/swift_db.rb"]
|
13
|
+
s.files = ["Manifest", "README.rdoc", "Rakefile", "lib/a.rb", "lib/common/comparison.rb", "lib/db.rb", "lib/root/binary.rb", "lib/root/internal_node.rb", "lib/root/leaf.rb", "lib/root/table.rb", "lib/root/tree.rb", "lib/swift_db.rb", "swift_db.gemspec"]
|
14
|
+
s.homepage = %q{https://github.com/ask4prasath/swift_db}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Swift_db", "--main", "README.rdoc"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{swift_db}
|
18
|
+
s.rubygems_version = %q{1.3.7}
|
19
|
+
s.summary = %q{Stores data in a B+tree structure}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
else
|
27
|
+
end
|
28
|
+
else
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: swift_db
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Prasath V Ram
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-12-05 00:00:00 +05:30
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Stores data in a B+tree structure
|
23
|
+
email: ask4prasath@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- README.rdoc
|
30
|
+
- lib/a.rb
|
31
|
+
- lib/common/comparison.rb
|
32
|
+
- lib/db.rb
|
33
|
+
- lib/root/binary.rb
|
34
|
+
- lib/root/internal_node.rb
|
35
|
+
- lib/root/leaf.rb
|
36
|
+
- lib/root/table.rb
|
37
|
+
- lib/root/tree.rb
|
38
|
+
- lib/swift_db.rb
|
39
|
+
files:
|
40
|
+
- Manifest
|
41
|
+
- README.rdoc
|
42
|
+
- Rakefile
|
43
|
+
- lib/a.rb
|
44
|
+
- lib/common/comparison.rb
|
45
|
+
- lib/db.rb
|
46
|
+
- lib/root/binary.rb
|
47
|
+
- lib/root/internal_node.rb
|
48
|
+
- lib/root/leaf.rb
|
49
|
+
- lib/root/table.rb
|
50
|
+
- lib/root/tree.rb
|
51
|
+
- lib/swift_db.rb
|
52
|
+
- swift_db.gemspec
|
53
|
+
has_rdoc: true
|
54
|
+
homepage: https://github.com/ask4prasath/swift_db
|
55
|
+
licenses: []
|
56
|
+
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options:
|
59
|
+
- --line-numbers
|
60
|
+
- --inline-source
|
61
|
+
- --title
|
62
|
+
- Swift_db
|
63
|
+
- --main
|
64
|
+
- README.rdoc
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
hash: 11
|
82
|
+
segments:
|
83
|
+
- 1
|
84
|
+
- 2
|
85
|
+
version: "1.2"
|
86
|
+
requirements: []
|
87
|
+
|
88
|
+
rubyforge_project: swift_db
|
89
|
+
rubygems_version: 1.3.7
|
90
|
+
signing_key:
|
91
|
+
specification_version: 3
|
92
|
+
summary: Stores data in a B+tree structure
|
93
|
+
test_files: []
|
94
|
+
|