added: support for generating LEFT JOIN statement in Finder

(the primary key should consist of only one column at the moment)



git-svn-id: svn://ttmath.org/publicrep/morm/branches/join_models@1186 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2019-03-26 18:34:07 +00:00
parent 440f56e376
commit 9c7a0f3d7e
10 changed files with 266 additions and 70 deletions

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2018, Tomasz Sowa
* Copyright (c) 2018-2019, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,14 +38,15 @@
#include <list>
#include <set>
#include "textstream/textstream.h"
#include "morm_types.h"
#include "date/date.h"
#include "morm_types.h"
#include "modeldata.h"
namespace morm
{
class Model;
class ModelData;
class ModelConnector;
@@ -57,6 +58,8 @@ public:
virtual ~BaseExpression();
virtual void set_work_mode(int work_mode);
virtual int get_work_mode();
virtual void prepare_to_new_expression();
virtual void set_column_prefix(const std::wstring & prefix);
@@ -71,7 +74,7 @@ public:
template<typename FieldValue>
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true)
void field(int table_index, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true, ModelData * model_data = nullptr)
{
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{
@@ -79,7 +82,24 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS )
{
put_field_name(field_name, add_column_prefix);
put_field_name(table_index, field_name, add_column_prefix);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_SAVE_FIELDS )
{
PT::TextStream str;
PT::TextStream * old_out_stream = out_stream;
out_stream = &str;
put_field_name(table_index, field_name, add_column_prefix);
out_stream = old_out_stream;
if( model_data )
{
model_data->morm_foreign_keys.emplace_back();
std::string & key_str = model_data->morm_foreign_keys.back();
str.to_string(key_str, false);
}
}
else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
@@ -89,15 +109,18 @@ public:
else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name);
put_field_name(table_index, field_name);
put_name_value_separator();
put_field_value(field_value);
}
field_after();
}
}
template<typename FieldValue>
void field_doc(Model & model, const wchar_t * field_name, const FieldValue & field_value,
bool insertable = true, bool updatable = true,
@@ -158,6 +181,11 @@ public:
{
field_before();
// if( work_mode == MORM_WORK_MODE_MODEL_FIELDS )
// {
// put_field_name(field_name);
// }
// else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name);
@@ -201,7 +229,7 @@ public:
void field_to_stream(PT::TextStream & stream, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false)
{
this->out_stream = &stream;
field(field_name, field_value, insertable, updatable, is_primary_key);
field(-1, field_name, field_value, insertable, updatable, is_primary_key);
this->out_stream = nullptr;
}
@@ -260,6 +288,7 @@ protected:
//void field(const wchar_t * field_name, Model & field, bool insertable = true, bool updatable = true);
virtual void put_field_name(int table_index, const wchar_t * field_name, bool add_column_prefix = true);
virtual void put_field_name(const wchar_t * field_name, bool add_column_prefix = true);
template<typename FieldValue>