add possibility of calculating how many rows there were before LIMIT was applied

The Finder has get_rows_counter() method which returns how many rows there were
before LIMIT clause was applied. The select(...) method should be called with
Select::with_rows_counter flag in such a case.

while here:
- change the semantic of Finder, now the select(...) method takes a morm::Select flags,
  and we have such flags:
  - Select::no_auto_generated_columns - do not generate columns from models
  - with_rows_counter - add an additional column for the rows counter
- remove Finder::prepare_to_select() - now use select(...) with no_auto_generated_columns flag
This commit is contained in:
2022-07-11 17:48:13 +02:00
parent 4e8f3af8fc
commit 43dfbd5d5a
16 changed files with 512 additions and 179 deletions

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2018-2021, Tomasz Sowa
* Copyright (c) 2018-2022, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -64,6 +64,8 @@ public:
use_table_prefix_for_fetching = c.use_table_prefix_for_fetching;
query_result = c.query_result;
select_status = c.select_status;
select_flags = c.select_flags;
rows_counter = c.rows_counter;
if( query_result )
{
@@ -106,6 +108,8 @@ public:
finder_helper.clear();
query_result = nullptr;
select_status = false;
select_flags = Select::default_type;
rows_counter = 0;
}
@@ -145,6 +149,18 @@ public:
}
virtual void set_select_flags(const Select & select_flags)
{
this->select_flags = select_flags;
}
virtual void set_rows_counter_column_name(const std::wstring & column_name)
{
this->rows_counter_column_name = column_name;
}
virtual QueryResult * get_query_result()
{
return query_result;
@@ -164,6 +180,23 @@ public:
}
virtual void prepare_model_env_for_new_object(ModelEnv & model_env)
{
model_env.cursor_helper = &cursor_helper;
model_env.finder_helper = &finder_helper;
model_env.select_flags = select_flags;
model_env.rows_counter = 0;
if( model_env.select_flags.is_with_rows_counter() )
{
if( cursor_helper.current_row == 0 )
{
model_env.rows_counter_column_name = rows_counter_column_name;
}
}
}
virtual bool get(ModelClass & result)
{
bool res = false;
@@ -177,20 +210,21 @@ public:
if( db_connector )
{
ModelEnv model_env_local;
result.model_env = &model_env_local;
result.model_env->cursor_helper = &cursor_helper;
result.model_env->finder_helper = &finder_helper;
result.model_env->model = &result;
try
{
ModelEnv model_env_local;
result.model_env = &model_env_local;
result.model_env->model = &result;
result.model_env->model_data = model_data;
finder_helper.clear(); // at the moment used only for calculating table prefixes (indices)
cursor_helper.clear();
cursor_helper.query_result = query_result;
cursor_helper.has_autogenerated_select = has_autogenerated_select;
cursor_helper.use_table_prefix_for_fetching_values = use_table_prefix_for_fetching;
result.model_env->model_data = model_data;
cursor_helper.current_row = 0;
prepare_model_env_for_new_object(model_env_local);
if( !cursor_helper.has_autogenerated_select && cursor_helper.use_table_prefix_for_fetching_values )
{
@@ -205,6 +239,7 @@ public:
if( query_result->cur_row < query_result->result_rows )
{
result.map_values_from_query();
rows_counter = model_env_local.rows_counter;
if( result.found() )
{
@@ -273,6 +308,7 @@ public:
return get_list_generic(result, clear_list);
}
virtual std::vector<ModelClass> get_vector()
{
std::vector<ModelClass> result;
@@ -282,6 +318,12 @@ public:
}
virtual size_t get_rows_counter()
{
return rows_counter;
}
protected:
@@ -293,6 +335,9 @@ protected:
FinderHelper finder_helper; // may CursorHelper and FinderHelper should be one class?
QueryResult * query_result;
bool select_status;
Select select_flags;
size_t rows_counter;
std::wstring rows_counter_column_name;
@@ -359,15 +404,15 @@ protected:
cursor_helper.query_result = query_result;
cursor_helper.has_autogenerated_select = has_autogenerated_select;
cursor_helper.use_table_prefix_for_fetching_values = use_table_prefix_for_fetching;
cursor_helper.current_row = query_result->cur_row;
added_model.set_connector(model_connector);
added_model.clear();
prepare_model_env_for_new_object(model_env_local);
added_model.model_env = &model_env_local;
added_model.model_env->cursor_helper = &cursor_helper;
added_model.model_env->finder_helper = &finder_helper;
added_model.model_env->model_data = model_data;
added_model.model_env->model = &added_model;
added_model.model_env->model_data = model_data;
if( !cursor_helper.has_autogenerated_select && cursor_helper.use_table_prefix_for_fetching_values )
{
@@ -377,6 +422,11 @@ protected:
added_model.before_select();
added_model.map_values_from_query();
if( model_env_local.select_flags.is_with_rows_counter() && query_result->cur_row == 0 )
{
rows_counter = model_env_local.rows_counter;
}
if( added_model.found() )
{
added_model.after_select();