- removed prefix() method from Finder

(this was for a custom prefix)
- removed column_prefix and column_prefix_index from BaseExpression
  now we have a pointer to ModelEnv passed in field() method
- to ModelEnv: added table_name, table_name_simple and table_index





git-svn-id: svn://ttmath.org/publicrep/morm/branches/join_models@1193 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2019-05-21 17:24:12 +00:00
parent 958e89fb02
commit a1d18735b0
9 changed files with 94 additions and 148 deletions

View File

@@ -123,7 +123,7 @@ public:
virtual bool save(ModelData * model_data = nullptr);
virtual bool save(ModelData & model_data);
virtual void generate_select_columns(PT::TextStream & stream, const std::string & column_prefix);
virtual void generate_select_columns(PT::TextStream & stream);
virtual void generate_doc_for_flat(PT::TextStream & stream, bool clear_stream = true);
virtual void generate_doc_for_db(PT::TextStream & stream, bool clear_stream = true);
@@ -722,53 +722,33 @@ protected:
void field_model_left_join(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key, DbExpression * db_expression)
{
if( model_env->finder_helper )
if( model_env && field_model.model_env && model_env->finder_helper )
{
//model_env->select_helper->morm_current_max_column += 1;
model_env->finder_helper->morm_foreign_keys.clear();
field_model.model_env->table_index = model_env->finder_helper->add_join_table(field_model.model_env->table_name_simple);
model_env->finder_helper->morm_finder_join_tables << "LEFT JOIN ";
field_model.table_name(model_env->finder_helper->morm_finder_join_tables);
model_env->finder_helper->morm_finder_join_tables << " AS ";
//////////////
PT::TextStream join_table_name_this;
table_name_for_join_as(join_table_name_this);
if( model_env->table_index > 1 )
join_table_name_this << model_env->table_index;
///////////
PT::TextStream join_table_name;
field_model.table_name_for_join_as(join_table_name);
field_model.model_env->table_index = model_env->finder_helper->add_join_table(join_table_name);
model_env->finder_helper->morm_finder_join_tables << "LEFT JOIN " << field_model.model_env->table_name
<< " AS " << field_model.model_env->table_name_simple;
if( field_model.model_env->table_index > 1 )
join_table_name << field_model.model_env->table_index;
//////////
model_env->finder_helper->morm_finder_join_tables << join_table_name;
model_env->finder_helper->morm_finder_join_tables << field_model.model_env->table_index;
int expr_work_mode = db_expression->get_work_mode();
int expr_output_type = db_expression->get_output_type();
bool expr_allow_prefix = db_expression->get_allow_to_use_prefix();
db_expression->set_work_mode(MORM_WORK_MODE_MODEL_SAVE_FIELDS);
db_expression->set_output_type(MORM_OUTPUT_TYPE_JOIN_TABLES);
db_expression->allow_to_use_prefix(false);
if( has_foreign_key )
{
field_model.map_fields();
model_env->finder_helper->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape?
model_env->finder_helper->morm_finder_join_tables << " = " << join_table_name << '.';
model_env->finder_helper->morm_finder_join_tables << " ON " << model_env->table_name_simple << '.'
<< db_field_name << " = " << field_model.model_env->table_name_simple << '.';
if( !model_env->finder_helper->morm_foreign_keys.empty() )
if( model_env->finder_helper->morm_foreign_keys.size() == 1 )
{
model_env->finder_helper->morm_finder_join_tables << model_env->finder_helper->morm_foreign_keys.front();
}
@@ -777,23 +757,21 @@ protected:
{
map_fields();
model_env->finder_helper->morm_finder_join_tables << " ON " << join_table_name_this << '.';
model_env->finder_helper->morm_finder_join_tables << " ON " << model_env->table_name_simple << '.';
if( !model_env->finder_helper->morm_foreign_keys.empty() )
if( model_env->finder_helper->morm_foreign_keys.size() == 1 )
{
model_env->finder_helper->morm_finder_join_tables << model_env->finder_helper->morm_foreign_keys.front();
}
model_env->finder_helper->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name;
model_env->finder_helper->morm_finder_join_tables << " = " << field_model.model_env->table_name_simple << '.' << db_field_name;
}
model_env->finder_helper->morm_finder_join_tables << ' ';
db_expression->set_work_mode(expr_work_mode);
db_expression->set_output_type(expr_output_type);
db_expression->allow_to_use_prefix(true);
db_expression->allow_to_use_prefix(expr_allow_prefix);
}
}
@@ -828,6 +806,9 @@ protected:
{
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL;
field_model.table_name(field_model.model_env->table_name);
field_model.table_name_for_join_as(field_model.model_env->table_name_simple);
if( db_expression->get_output_type() == MORM_OUTPUT_TYPE_SELECT_COLUMNS )
{
field_model_left_join(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key, db_expression);
@@ -835,23 +816,7 @@ protected:
if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES )
{
// they dont have to be copied out, this is the same as current table name and table_index
std::string current_prefix = db_expression->get_column_prefix();
int current_table_index = db_expression->get_column_prefix_index();
///////////
PT::TextStream join_table_name;
field_model.table_name_for_join_as(join_table_name); // RENAME this method
std::string sss; // improve me
join_table_name.to_string(sss);
// now we dont need set_column_prefix()?, we can pass ModelEnv there somewhat?
db_expression->set_column_prefix(sss, field_model.model_env->table_index);
field_model.map_fields();
db_expression->set_column_prefix(current_prefix, current_table_index);
}
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
@@ -912,7 +877,9 @@ protected:
{
if( model_connector && model_env )
{
ModelEnv model_env_local(*model_env);
ModelEnv model_env_local;
model_env_local.copy_global_objects(*model_env);
field_model.model_env = &model_env_local;
field_model.set_connector(model_connector);