Readme update to include a few words on tags.

This commit is contained in:
Karchnu 2024-04-26 23:28:36 +02:00
parent bcfe5d44d6
commit fce2b633ce

View File

@ -162,25 +162,16 @@ $ tree storage/
... ...
└── tags └── tags
└── by_keyword └── by_keyword
└── other-tags ├── elegant
├── average │   ├── 0000000000.json -> ../../../data/0000000000.json
│   ├── data │   └── 0000000003.json -> ../../../data/0000000003.json
│   │   └── 0000000004.json -> ../../../../..//data/0000000004.json ├── impressive
... │   ├── 0000000000.json -> ../../../data/0000000000.json
├── dirty │   ├── 0000000001.json -> ../../../data/0000000001.json
│   ├── data │   └── 0000000003.json -> ../../../data/0000000003.json
│   │   └── 0000000005.json -> ../../../../..//data/0000000005.json
...
├── elegant
│   ├── data
│   │   ├── 0000000000.json -> ../../../../..//data/0000000000.json
│   │   └── 0000000003.json -> ../../../../..//data/0000000003.json
... ...
``` ```
This is very similar to partitions, but there is a bit more complexity here since we eventually search for a car matching a combination of keywords. Tags are very similar to partitions and are used the exact same way for search, update and deletion.
**TODO**: explanations about our tag-based search and an example.
## Updating an object ## Updating an object
@ -204,23 +195,41 @@ cars_by_id.update "86a07924-ab3a-4f46-a975-e9803acba22d", 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 car.id, car cars_by_id.update_or_create car.id, car
# Search by partitions: all blue cars.
pp! cars_by_color.get "blue"
# Search by tags: all elegant cars.
pp! cars_by_keyword.get "elegant"
``` ```
Changing a value that is related to a partition or a tag will automatically do what you would expect: de-index then re-index.
You won't find yourself with a bunch of invalid symbolic links all over the place.
## Removing an object ## Removing an object
```Crystal ```Crystal
# Remove a value based on an index.
cars_by_id.delete "86a07924-ab3a-4f46-a975-e9803acba22d" cars_by_id.delete "86a07924-ab3a-4f46-a975-e9803acba22d"
# Remove a value based on a partition.
cars_by_color.delete "red" cars_by_color.delete "red"
cars_by_color.delete "red", do |car| cars_by_color.delete "blue", do |car|
car.keywords.empty car.keywords.empty
end end
# Remove a value based on a tag.
cars_by_keyword.delete "shiny"
cars_by_keyword.delete "elegant", do |car|
car.name == "GTI"
end
``` ```
In this last example, we apply the function on red cars only. In this code snippet, we apply a function on blue cars only;
and blue cars are only removed if they don't have any associated keywords.
Same thing for elegant cars.
This represents a performance boost compared to applying the function on all the cars. This represents a performance boost compared to applying the function on all the cars.
# Complete example # Complete example
```Crystal ```Crystal
@ -292,11 +301,10 @@ pp! cars_by_name.get "Corvet"
# based on a partition (print all red cars) # based on a partition (print all red cars)
pp! cars_by_color.get "red" pp! cars_by_color.get "red"
# based on a tag # based on a tag (print all fast cars)
pp! cars_by_keyword.get "fast" pp! cars_by_keyword.get "fast"
############ ############
# Updating # # Updating #
############ ############
@ -314,7 +322,11 @@ cars_by_name.update "Bullet-GT", car # the name changed
car = Car.new "Mustang", "red", [] of String car = Car.new "Mustang", "red", [] of String
cars_by_name.update_or_create car.name, car cars_by_name.update_or_create car.name, car
# We all know it, elegant cars are also expensive.
cars_by_keyword.get("elegant").each do |car|
car.keywords << "expensive"
cars_by_name.update car.name, car
end
############### ###############
# Deleting... # # Deleting... #
@ -328,9 +340,8 @@ cars_by_color.delete "red"
# based on a 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. # based on a keyword
# # based on a keyword cars_by_keyword.delete "solid"
# cars_by_keyword.delete "solid" # based on a keyword (but not only)
# # based on a keyword (but not only) cars_by_keyword.delete "fast", &.name.==("Corvet")
# cars_by_keyword.delete "fast", &.name.==("Corvet")
``` ```