2.6 KiB
2.6 KiB
Todo
-
move
prepare_*methods fromdialecttoquery_compiler -
add
insert_query_builderandupdate_update_builder(returning multiple statements) -
finish fetch eager many-to-many relations
-
implement lazy loading
-
implement polymorphic class hierarchies
-
finish
database(schema_repository) class (move add/drop fromsessiontoschema) -
implement a flag class for enumerations
-
PK generator
- Introduce execute_result
- Add
abstract_pk_generatorclass - Add
identity_pk_generatorclass - Add
sequence_pk_generatorclass - Add
table_pk_generatorclass - Add
manual_pk_generatorclass - Extend
session::insertlogic to use pk generator - Add generator to
schema_nodeortableclass when attaching type
struct abstract_pk_generator {
virtual ~abstract_pk_generator() = default;
virtual int64_t next_id() = 0;
virtual std::vector<int64_t> next_ids(int count) = 0;
};
struct sequence_pk_generator : abstract_pk_generator {
explicit sequence_pk_generator(const std::string& sequence_name)
: query_(query::query::select().nextval(sequence_name)) {}
int64_t next_id(sql::executor& exec) override {
return query_.fetch_value<int64_t>(exec);
}
std::vector<int64_t> next_ids(int count) override;
private:
query::fetchable_query query_;
};
struct table_pk_generator : abstract_pk_generator {
explicit table_pk_generator(const std::string& table_name);
int64_t next_id() override;
std::vector<int64_t> next_ids(int count) override;
private:
std::string table_name_;
};
Proposal for polymorphic classes:
object_ptr::as does the following checks;
- The requested type has a super class
- Super class has a discriminator column defined
- Super class has a discriminator value defined
- Discriminator value is mapped to the requested type
If all checks succeed, the requested is fetched from the database.
schema.attach<jobs::Payload>("payloads", make_polymorph("type"));
schema.attach<jobs::Payload, jobs::IdPayload>("id_list_payloads", {"IdPayload"});
schema.attach<jobs::Payload, jobs::IdListPayload>("id_payloads", {"IdListPayload"});
//schema.attach<jobs::Payload, jobs::IdPayload>("id_list_payloads", make_polymorph_type("IdPayload"));
//schema.attach<jobs::Payload, jobs::IdListPayload>("id_payloads", make_polymorph_type("IdListPayload"));
object::object_ptr<jobs::Payload> payload;
auto result = payload.as<jobs::IdPayload>();
if (result.is_ok()) {
const auto& is_payload = result.value();
// Use requested type
id_payload->id = 1;
}
payload.is_polymorphic();
payload.is_polymorphic_type<jobs::IdPayload>();