Readme: some fixes, some explanations about deletion base on partition.
This commit is contained in:
parent
05b5a76ef5
commit
4ba6c26a21
37
README.md
37
README.md
@ -12,7 +12,7 @@ The objective is to get rid of DBMS when storing simple files directly on the fi
|
|||||||
A brief summary:
|
A brief summary:
|
||||||
- no SQL
|
- no SQL
|
||||||
- objects are serialized (currently in JSON)
|
- objects are serialized (currently in JSON)
|
||||||
- indexes (simple soft links on the FS) can be created to improve significantly searches in the db
|
- indexes (simple symlinks on the FS) can be created to improve significantly searches in the db
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
@ -83,8 +83,9 @@ class Car
|
|||||||
include JSON::Serializable
|
include JSON::Serializable
|
||||||
property id : String
|
property id : String
|
||||||
property color : String
|
property color : String
|
||||||
|
property keywords : Array(String)
|
||||||
|
|
||||||
def initialize(@color)
|
def initialize(@color, @keywords)
|
||||||
@id = UUID.random.to_s
|
@id = UUID.random.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -120,14 +121,14 @@ storage
|
|||||||
│ └── 8b4e83e3-ef95-40dc-a6e5-e6e697ce6323.json -> ../../data/0000000001.json
|
│ └── 8b4e83e3-ef95-40dc-a6e5-e6e697ce6323.json -> ../../data/0000000001.json
|
||||||
```
|
```
|
||||||
|
|
||||||
We have 5 objects in the DB, each of them have a unique ID attribute, each attribute is related to a single object.
|
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 their ID is as simple as `cat storage/indices/by_id/<id>.json`.
|
Getting an object by its ID is as simple as `cat storage/indices/by_id/<id>.json`.
|
||||||
|
|
||||||
|
|
||||||
Now we want to sort cars based on their `color` attribute.
|
Now we want to sort cars based on their `color` attribute.
|
||||||
This time, we use a `partition`, because the relation between the attribute (color) and the object (car) is `1-n`:
|
This time, we use a `partition`, because the relation between the attribute (color) and the object (car) is `1-n`:
|
||||||
```Crystal
|
```Crystal
|
||||||
cars_by_colors = things.new_partition "color", &.color
|
cars_by_colors = cars.new_partition "color", &.color
|
||||||
```
|
```
|
||||||
|
|
||||||
On the file-system, this translates to:
|
On the file-system, this translates to:
|
||||||
@ -147,7 +148,7 @@ $ tree storage/
|
|||||||
│ └── 0000000005.json -> ../../../data/0000000005.json
|
│ └── 0000000005.json -> ../../../data/0000000005.json
|
||||||
```
|
```
|
||||||
|
|
||||||
Now the attribute correspond to a directory (blue, red, violet, etc.) containing a symlink for each related object.
|
Now the attribute corresponds to a directory (blue, red, violet, etc.) containing a symlink for each related object.
|
||||||
|
|
||||||
Finally, we want to sort cars based on the `keywords` attribute.
|
Finally, we want to sort cars based on the `keywords` attribute.
|
||||||
This is a n-n relation, each car may have several keywords, each keyword may be related to several cars.
|
This is a n-n relation, each car may have several keywords, each keyword may be related to several cars.
|
||||||
@ -183,7 +184,7 @@ This is very similar to partitions, but there is a bit more complexity here sinc
|
|||||||
|
|
||||||
## Updating an object
|
## Updating an object
|
||||||
|
|
||||||
In our last example we had a `Car` class, we stored its instances in `cars` and we could identify each instance by its `id` with the index `car_by_id`.
|
In our last example we had a `Car` class, we stored its instances in `cars` and we could identify each instance by its `id` with the index `cars_by_id`.
|
||||||
Now, we want to update a car:
|
Now, we want to update a car:
|
||||||
```Crystal
|
```Crystal
|
||||||
# we find a car we want to modify
|
# we find a car we want to modify
|
||||||
@ -193,25 +194,29 @@ car = cars_by_id "86a07924-ab3a-4f46-a975-e9803acba22d"
|
|||||||
car.color = "Blue"
|
car.color = "Blue"
|
||||||
|
|
||||||
# update
|
# update
|
||||||
cars_by_id.update "86a07924-ab3a-4f46-a975-e9803acba22d", car
|
cars_by_id.update car.id, car
|
||||||
```
|
```
|
||||||
|
|
||||||
Or, in the case the object may not yet exist:
|
Or, in the case the object may not yet exist:
|
||||||
```Crystal
|
```Crystal
|
||||||
cars_by_id.update_or_create "86a07924-ab3a-4f46-a975-e9803acba22d", car
|
cars_by_id.update_or_create car.id, car
|
||||||
```
|
```
|
||||||
|
|
||||||
## Removing an object
|
## Removing an object
|
||||||
|
|
||||||
```Crystal
|
```Crystal
|
||||||
cars_by_id.delete "86a07924-ab3a-4f46-a975-e9803acba22d", car
|
cars_by_id.delete "86a07924-ab3a-4f46-a975-e9803acba22d"
|
||||||
|
|
||||||
cars_by_class.delete "red"
|
cars_by_color.delete "red"
|
||||||
cars_by_class.delete "red", do |car|
|
cars_by_color.delete "red", do |car|
|
||||||
car.name == "Corvet" || car.keywords.empty
|
car.keywords.empty
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
In this last example, we apply the function on red cars only.
|
||||||
|
This represents a performance boost compared to applying the function on all the cars.
|
||||||
|
|
||||||
|
|
||||||
# Complete example
|
# Complete example
|
||||||
|
|
||||||
```Crystal
|
```Crystal
|
||||||
@ -265,7 +270,7 @@ cars << Car.new "SUV", "red", [ "solid", "impressive" ]
|
|||||||
cars << Car.new "Mustang", "red", [ "shiny", "impressive", "elegant" ]
|
cars << Car.new "Mustang", "red", [ "shiny", "impressive", "elegant" ]
|
||||||
cars << Car.new "Bullet-GT", "red", [ "shiny", "impressive", "fast", "elegant" ]
|
cars << Car.new "Bullet-GT", "red", [ "shiny", "impressive", "fast", "elegant" ]
|
||||||
cars << Car.new "GTI", "blue", [ "average" ]
|
cars << Car.new "GTI", "blue", [ "average" ]
|
||||||
cars << Car.new "Deudeuch", "violet", [ "dirty", "slow", "only french will understand" ]
|
cars << Car.new "Deudeuch", "violet", [ "dirty", "slow", "only French will understand" ]
|
||||||
|
|
||||||
# The DB can be accessed as a simple array
|
# The DB can be accessed as a simple array
|
||||||
cars.each do |car|
|
cars.each do |car|
|
||||||
@ -310,9 +315,9 @@ cars_by_name.update_or_create car.name, car
|
|||||||
# based on a name
|
# based on a name
|
||||||
cars_by_name.delete "Deudeuch"
|
cars_by_name.delete "Deudeuch"
|
||||||
|
|
||||||
# based on their color
|
# based on a color
|
||||||
cars_by_color.delete "red"
|
cars_by_color.delete "red"
|
||||||
# based on their color (but not only)
|
# based on a color (but not only)
|
||||||
cars_by_color.delete "blue", &.name.==("GTI")
|
cars_by_color.delete "blue", &.name.==("GTI")
|
||||||
|
|
||||||
## TAG-based deletion, soon.
|
## TAG-based deletion, soon.
|
||||||
|
Loading…
Reference in New Issue
Block a user