🗃️ Fix #7: Add indexes #12
Merged
alexis.drai
merged 4 commits from feature/add-indexes
into main
2 years ago
@ -1,87 +0,0 @@
|
||||
# About the database schema
|
||||
|
||||
## Collections
|
||||
|
||||
### trainers collection
|
||||
|
||||
* _id: ObjectId
|
||||
* name: string
|
||||
* (_indexed_: would often be queried in a dashboard situation)
|
||||
* dob: date
|
||||
* wins: int
|
||||
* losses: int
|
||||
* pastOpponents: array of ObjectId (references to other trainers)
|
||||
* (_indexed_: reflexivity would make deep queries quite slow, so it seems worthwhile)
|
||||
* pokemongs: array of ObjectId (references to owned pokemongs) + denormalizing on "nickname" and "species"
|
||||
* (_indexed_: to improve speed when querying non-denormalized fields)
|
||||
|
||||
### pokemongs collection
|
||||
|
||||
* _id: ObjectId
|
||||
* nickname: string?
|
||||
* dob: date
|
||||
* level: int
|
||||
* pokedexId: int
|
||||
* evoStage: int
|
||||
* (_indexed_: "species" is calculated as evoTrack[evoStage], and would often be queried)
|
||||
* evoTrack: array of strings (therefore "species" is evoTrack[evoStage], and "evoBase" is evoTrack[0])
|
||||
* (_indexed_: "species" is calculated as evoTrack[evoStage], and would be queried often)
|
||||
* trainer: ObjectId? (reference to a trainer) (but can be "wild" instead, if ref is null)
|
||||
* (_indexed_: could be queried often in a dashboard situation)
|
||||
* types: embedded type, or array of embedded types
|
||||
* (_indexed_: would often be queried in a dashboard situation)
|
||||
* moveSet: array of ObjectId (references to known moves) + denormalizing on "name"
|
||||
|
||||
### moves collection
|
||||
|
||||
* _id: ObjectId
|
||||
* name: string
|
||||
* (_indexed_: would often be queried in a dashboard situation)
|
||||
* category: string (can be "physical", "special", or "status")
|
||||
* power: int
|
||||
* (_indexed_: would often be used in sorts, in a dashboard situation)
|
||||
* accuracy: int
|
||||
* type: embedded type
|
||||
* (_indexed_: would often be queried in a dashboard situation)
|
||||
|
||||
### types collection
|
||||
|
||||
* _id: ObjectId
|
||||
* name: string
|
||||
* (_indexed_: would often be queried in a dashboard situation)
|
||||
* weakAgainst: array of strings (denormalized type names)
|
||||
* effectiveAgainst: array of strings (denormalized type names)
|
||||
|
||||
## Relationships
|
||||
|
||||
- Trainer
|
||||
- [x] trainers.pastOpponents: one-to-many and reflexive
|
||||
* => referencing
|
||||
- [x] trainers.pokemongs: one-to-many
|
||||
* => referencing + denormalizing on "nickname" and "species"
|
||||
- Pokemong
|
||||
- [x] pokemongs.trainer: many-to-one
|
||||
* => referencing
|
||||
- [x] pokemongs.types: one-to-few [1;2]
|
||||
* => embedding
|
||||
- [x] pokemongs.moveSet: one-to-few [0;4] but will also need to be queried independently
|
||||
* => referencing + denormalizing on "name"
|
||||
- Move
|
||||
- [x] moves.type: one-to-one [1;1]
|
||||
* => embedding
|
||||
- Type
|
||||
- [x] types.weakAgainst & types.effectiveAgainst: one-to-few, but reflexive
|
||||
* => denormalizing on "name"
|
||||
|
||||
## Cascades
|
||||
|
||||
- Pokemong
|
||||
- [x] delete ~> trainer.pokemongs
|
||||
- [x] update ~> trainer.pokemongs (denormalizing on "nickname" and "species")
|
||||
- [x] create ~> trainer.pokemongs
|
||||
- Trainer
|
||||
- [x] delete ~> pokemong.trainer
|
||||
- [x] create ~> pokemong.trainer
|
||||
- Move
|
||||
- [x] delete ~> pokemong.moveSet
|
||||
- [x] update ~> pokemong.moveSet (denormalizing on "name")
|
@ -0,0 +1,46 @@
|
||||
package fr.uca.iut;
|
||||
|
||||
import fr.uca.iut.entities.GenericEntity;
|
||||
import fr.uca.iut.repositories.GenericRepository;
|
||||
import fr.uca.iut.repositories.MoveRepository;
|
||||
import fr.uca.iut.repositories.PokemongRepository;
|
||||
import fr.uca.iut.repositories.TrainerRepository;
|
||||
import io.quarkus.runtime.StartupEvent;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.enterprise.event.Observes;
|
||||
import jakarta.inject.Inject;
|
||||
import org.bson.Document;
|
||||
|
||||
@ApplicationScoped
|
||||
public class Startup {
|
||||
|
||||
@Inject
|
||||
MoveRepository moveRepository;
|
||||
@Inject
|
||||
PokemongRepository pokemongRepository;
|
||||
@Inject
|
||||
TrainerRepository trainerRepository;
|
||||
|
||||
void onStart(@Observes StartupEvent ev) {
|
||||
createIndex(moveRepository);
|
||||
createIndex(pokemongRepository);
|
||||
createIndex(trainerRepository);
|
||||
}
|
||||
|
||||
private void createIndex(GenericRepository<? extends GenericEntity> repository) {
|
||||
try {
|
||||
repository.createIndexes();
|
||||
printIndexes(repository);
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error creating indexes for repository: " + repository.getClass());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void printIndexes(GenericRepository<? extends GenericEntity> repository) {
|
||||
System.out.println("indexes for " + repository.getClass());
|
||||
for (Document index : repository.getCollection().listIndexes()) {
|
||||
System.out.println(index.toJson());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue