diff --git a/README.md b/README.md index 6f5fd31..a4210b2 100644 --- a/README.md +++ b/README.md @@ -132,24 +132,24 @@ After adding a few objects in the database, here the index in action on the file $ tree storage/ storage ├── data -│   ├── 0000000000.json -│   ├── 0000000001.json -│   ├── 0000000002.json -│   ├── 0000000003.json -│   ├── 0000000004.json -│   └── 0000000005.json +│   ├── 0000000000 +│   ├── 0000000001 +│   ├── 0000000002 +│   ├── 0000000003 +│   ├── 0000000004 +│   └── 0000000005 ├── indices │   └── by_id -│   ├── 6e109b82-25de-4250-9c67-e7e8415ad5a7.json -> ../../data/0000000003.json -│   ├── 2080131b-97d7-4300-afa9-55b93cdfd124.json -> ../../data/0000000000.json -│   ├── 2118bf1c-e413-4658-b8c1-a08925e20945.json -> ../../data/0000000005.json -│   ├── b53fab8e-f394-49ef-b939-8a670abe278b.json -> ../../data/0000000004.json -│   ├── 7e918680-6bc2-4f29-be7e-3d2e9c8e228c.json -> ../../data/0000000002.json -│   └── 8b4e83e3-ef95-40dc-a6e5-e6e697ce6323.json -> ../../data/0000000001.json +│   ├── 6e109b82-25de-4250-9c67-e7e8415ad5a7 -> ../../data/0000000003 +│   ├── 2080131b-97d7-4300-afa9-55b93cdfd124 -> ../../data/0000000000 +│   ├── 2118bf1c-e413-4658-b8c1-a08925e20945 -> ../../data/0000000005 +│   ├── b53fab8e-f394-49ef-b939-8a670abe278b -> ../../data/0000000004 +│   ├── 7e918680-6bc2-4f29-be7e-3d2e9c8e228c -> ../../data/0000000002 +│   └── 8b4e83e3-ef95-40dc-a6e5-e6e697ce6323 -> ../../data/0000000001 ``` We have 5 objects in the DB, each of them has a unique ID attribute, each attribute is related to a single object. -Getting an object by its ID is as simple as `cat storage/indices/by_id/.json`. +Getting an object by its ID is as simple as `cat storage/indices/by_id/`. Now we want to sort cars based on their `color` attribute. @@ -165,14 +165,14 @@ $ tree storage/ ├── partitions │   └── by_color │   ├── blue -│   │   ├── 0000000000.json -> ../../../data/0000000000.json -│   │   └── 0000000004.json -> ../../../data/0000000004.json +│   │   ├── 0000000000 -> ../../../data/0000000000 +│   │   └── 0000000004 -> ../../../data/0000000004 │   ├── red -│   │   ├── 0000000001.json -> ../../../data/0000000001.json -│   │   ├── 0000000002.json -> ../../../data/0000000002.json -│   │   └── 0000000003.json -> ../../../data/0000000003.json +│   │   ├── 0000000001 -> ../../../data/0000000001 +│   │   ├── 0000000002 -> ../../../data/0000000002 +│   │   └── 0000000003 -> ../../../data/0000000003 │   └── violet -│   └── 0000000005.json -> ../../../data/0000000005.json +│   └── 0000000005 -> ../../../data/0000000005 ``` Now the attribute corresponds to a directory (blue, red, violet, etc.) containing a symlink for each related object. @@ -190,12 +190,12 @@ $ tree storage/ └── tags └── by_keyword ├── elegant - │   ├── 0000000000.json -> ../../../data/0000000000.json - │   └── 0000000003.json -> ../../../data/0000000003.json + │   ├── 0000000000 -> ../../../data/0000000000 + │   └── 0000000003 -> ../../../data/0000000003 ├── impressive - │   ├── 0000000000.json -> ../../../data/0000000000.json - │   ├── 0000000001.json -> ../../../data/0000000001.json - │   └── 0000000003.json -> ../../../data/0000000003.json + │   ├── 0000000000 -> ../../../data/0000000000 + │   ├── 0000000001 -> ../../../data/0000000001 + │   └── 0000000003 -> ../../../data/0000000003 ... ``` Tags are very similar to partitions and are used the exact same way for search, update and deletion. diff --git a/src/dodb.cr b/src/dodb.cr index e73e79c..074b3b4 100644 --- a/src/dodb.cr +++ b/src/dodb.cr @@ -200,7 +200,7 @@ abstract class DODB::Storage(V) end private def file_path(key : Int32) - "#{data_path}/%010i.json" % key + "#{data_path}/%010i" % key end private def locks_directory : String diff --git a/src/dodb/index.cr b/src/dodb/index.cr index 9086744..5c0f31d 100644 --- a/src/dodb/index.cr +++ b/src/dodb/index.cr @@ -1,5 +1,4 @@ require "file_utils" -require "json" require "./exceptions.cr" require "./indexer.cr" @@ -91,10 +90,7 @@ class DODB::Index(V) < DODB::Indexer(V) raise MissingEntry.new(@name, index) unless ::File.exists? file_path - ::File.readlink(file_path) - .sub(/\.json$/, "") - .sub(/^.*\//, "") - .to_i + ::File.readlink(file_path).sub(/^.*\//, "").to_i end def get_with_key(index : String) : Tuple(V, Int32) @@ -138,11 +134,11 @@ class DODB::Index(V) < DODB::Indexer(V) # FIXME: Now that it’s being used outside of this class, name it properly. def file_path_index(index_key : String) - "#{indexing_directory}/#{index_key}.json" + "#{indexing_directory}/#{index_key}" end private def get_data_symlink_index(key : String) - "../../data/#{key}.json" + "../../data/#{key}" end end diff --git a/src/dodb/partition.cr b/src/dodb/partition.cr index 3220900..0060932 100644 --- a/src/dodb/partition.cr +++ b/src/dodb/partition.cr @@ -1,5 +1,4 @@ require "file_utils" -require "json" require "./indexer.cr" @@ -78,9 +77,7 @@ class DODB::Partition(V) < DODB::Indexer(V) end private def get_key(path : String) : Int32 - path.sub(/\.json$/, "") - .sub(/^.*\//, "") - .to_i + path.sub(/^.*\//, "").to_i end private def indexing_directory(partition) @@ -88,11 +85,11 @@ class DODB::Partition(V) < DODB::Indexer(V) end private def get_partition_symlink(partition : String, key : String) - "#{indexing_directory partition}/#{key}.json" + "#{indexing_directory partition}/#{key}" end private def get_data_symlink(key : String) - "../../../data/#{key}.json" + "../../../data/#{key}" end end diff --git a/src/dodb/tags.cr b/src/dodb/tags.cr index d202b26..1c53386 100644 --- a/src/dodb/tags.cr +++ b/src/dodb/tags.cr @@ -1,5 +1,4 @@ require "file_utils" -require "json" class DODB::Tags(V) < DODB::Indexer(V) property name : String @@ -89,9 +88,7 @@ class DODB::Tags(V) < DODB::Indexer(V) end private def get_key(path : String) : Int32 - path.sub(/\.json$/, "") - .sub(/^.*\//, "") - .to_i + path.sub(/^.*\//, "").to_i end def indexing_directory : String @@ -103,10 +100,10 @@ class DODB::Tags(V) < DODB::Indexer(V) end private def get_tagged_entry_path(tag : String, key : String) - "#{indexing_directory}/#{tag}/#{key}.json" + "#{indexing_directory}/#{tag}/#{key}" end private def get_data_symlink(key : String) - "../../../data/#{key}.json" + "../../../data/#{key}" end end