Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Detached field rendering #1106

Merged
merged 6 commits into from Nov 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 34 additions & 7 deletions backend/Origam.DA.Service/AbstractSqlDataService.cs
Expand Up @@ -200,18 +200,14 @@ public abstract class AbstractSqlDataService : AbstractDataService
private IDbDataAdapterFactory adapterFactory;
private string connectionString = "";
private const int DATA_VISUALIZATION_MAX_LENGTH = 100;
private readonly IDetachedFieldPacker detachedFieldPacker;

#region Constructors
public AbstractSqlDataService(IDetachedFieldPacker detachedFieldPacker)
public AbstractSqlDataService()
{
this.detachedFieldPacker = detachedFieldPacker;
}

public AbstractSqlDataService(
string connection, int bulkInsertThreshold,
int updateBatchSize, IDetachedFieldPacker detachedFieldPacker)
: this(detachedFieldPacker)
string connection, int bulkInsertThreshold, int updateBatchSize)
{
connectionString = connection;
UpdateBatchSize = updateBatchSize;
Expand Down Expand Up @@ -1842,11 +1838,42 @@ private List<ColumnData> GetAllQueryColumns(DataStructureQuery query)
values[i] = new KeyValuePair<string, object>(
queryColumn.Name , value);
}
yield return detachedFieldPacker.ProcessReaderOutput(
yield return ProcessReaderOutput(
values, queryColumns);
}
}
}

private static List<KeyValuePair<string, object>> ProcessReaderOutput(KeyValuePair<string, object>[] values, List<ColumnData> columnData)
{
if (columnData == null)
throw new ArgumentNullException(nameof(columnData));
var updatedValues = new List<KeyValuePair<string, object>>();

for (int i = 0; i < columnData.Count; i++)
{
if (columnData[i].IsVirtual)
{
if (columnData[i].HasRelation && values[i].Value != null && values[i].Value != DBNull.Value)
{
updatedValues.Add(new KeyValuePair<string, object>(
values[i].Key, ((string)values[i].Value).Split((char)1)));
continue;
}
else
{
updatedValues.Add(new KeyValuePair<string, object>
(values[i].Key, columnData[i].DefaultValue));
continue;
}
}
updatedValues.Add(new KeyValuePair<string, object>(
values[i].Key, values[i].Value));
}

return updatedValues;
}


private static DataStructureEntity GetEntity(
DataStructureQuery query, DataStructure dataStructure)
Expand Down
Expand Up @@ -40,7 +40,6 @@ namespace Origam.DA.Service
public abstract class AbstractSqlCommandGenerator : IDbDataAdapterFactory, IDisposable
{
protected readonly SQLValueFormatter sqlValueFormatter;
private readonly IDetachedFieldPacker detachedFieldPacker;
internal readonly ParameterReference PageNumberParameterReference = new ParameterReference();
internal readonly ParameterReference PageSizeParameterReference = new ParameterReference();
internal readonly AbstractFilterRenderer filterRenderer;
Expand All @@ -50,14 +49,13 @@ public abstract class AbstractSqlCommandGenerator : IDbDataAdapterFactory, IDisp
protected readonly SqlRenderer sqlRenderer;

public AbstractSqlCommandGenerator(string trueValue, string falseValue,
IDetachedFieldPacker detachedFieldPacker, SQLValueFormatter sqlValueFormatter,
AbstractFilterRenderer filterRenderer, SqlRenderer sqlRenderer)
SQLValueFormatter sqlValueFormatter, AbstractFilterRenderer filterRenderer,
SqlRenderer sqlRenderer)
{
PageNumberParameterReference.ParameterId = new Guid("3e5e12e4-a0dd-4d35-a00a-2fdb267536d1");
PageSizeParameterReference.ParameterId = new Guid("c310d577-d4d9-42da-af92-a5202ba26e79");
True = trueValue;
False = falseValue;
this.detachedFieldPacker = detachedFieldPacker;
this.sqlValueFormatter = sqlValueFormatter;
this.filterRenderer = filterRenderer;
this.sqlRenderer = sqlRenderer;
Expand Down Expand Up @@ -1074,7 +1072,7 @@ internal void SelectParameterDeclarationsSetSql(StringBuilder result, Hashtable
}

// From
RenderSelectFromClause(sqlExpression, entity, entity, filter, replaceParameterTexts);
RenderSelectFromClause(sqlExpression, entity);

bool whereExists = false;

Expand Down Expand Up @@ -2571,7 +2569,7 @@ in lookupEntity.ChildrenRecursive
}


internal void RenderSelectFromClause(StringBuilder sqlExpression, DataStructureEntity baseEntity, DataStructureEntity stopAtEntity, DataStructureFilterSet filter, Hashtable replaceParameterTexts)
internal void RenderSelectFromClause(StringBuilder sqlExpression, DataStructureEntity baseEntity)
{
PrettyLine(sqlExpression);
sqlExpression.Append("FROM");
Expand Down Expand Up @@ -3124,7 +3122,7 @@ private string RenderExpression(ColumnRenderItem columnRenderItem, Hashtable rep
else if (item is DetachedField detachedField)
{
return renderSqlForDetachedFields
? detachedFieldPacker.RenderSqlExpression(entity, detachedField)
? RenderSqlExpression(entity, detachedField)
: "";
}
else if (item is AggregatedColumn)
Expand All @@ -3133,6 +3131,34 @@ private string RenderExpression(ColumnRenderItem columnRenderItem, Hashtable rep
throw new NotImplementedException(ResourceUtils.GetString("TypeNotSupported", item.GetType().ToString()));
}

public string RenderSqlExpression(DataStructureEntity entity,
DetachedField detachedField)
{
if (detachedField.ArrayRelation == null)
{
return "";
}

DataStructureEntity relation = entity.ChildItems.ToGeneric()
.OfType<DataStructureEntity>()
.FirstOrDefault(child =>
child.Entity.PrimaryKey.Equals(detachedField.ArrayRelation.PrimaryKey));

var columnRenderItem = new ColumnRenderItem
{
SchemaItem = detachedField.ArrayValueField,
Entity = relation,
RenderSqlForDetachedFields = false
};
string columnToAggregate = RenderExpression(columnRenderItem, null, null, null);
var sqlExpression = new StringBuilder(
$"(SELECT STRING_AGG({sqlRenderer.Text(RenderExpression(columnRenderItem, null, null, null))} , CHAR(1)) ");
RenderSelectFromClause(sqlExpression, relation);
RenderSelectRelation(sqlExpression, relation, relation, null, null, true, true, 0, false, null, null);
sqlExpression.Append(")");
return sqlExpression.ToString();
}

internal string AggregationHelper(AggregatedColumn topLevelItem, DataStructureEntity topLevelEntity, AggregatedColumn item, Hashtable replaceParameterTexts, int level, StringBuilder joins, Hashtable dynamicParameters, Hashtable parameterReferences)
{
AggregatedColumn agg2 = item.Field as AggregatedColumn;
Expand Down
142 changes: 0 additions & 142 deletions backend/Origam.DA.Service/Generators/DetachedFieldPacker.cs

This file was deleted.

Expand Up @@ -34,11 +34,10 @@ namespace Origam.DA.Service
{
public class MsSqlCommandGenerator : AbstractSqlCommandGenerator
{
public MsSqlCommandGenerator(IDetachedFieldPacker detachedFieldPacker) :
public MsSqlCommandGenerator() :
base(
trueValue: "1",
falseValue: "0",
detachedFieldPacker: detachedFieldPacker,
sqlValueFormatter: new SQLValueFormatter("1", "0",
(text) => text.Replace("%", "[%]").Replace("_", "[_]"))
, filterRenderer: new MsSqlFilterRenderer(),
Expand Down Expand Up @@ -287,7 +286,7 @@ internal override string SqlDataType(IDataParameter Iparam)
public override object Clone()
{
MsSqlCommandGenerator gen =
new MsSqlCommandGenerator(new DetachedFieldPackerMs());
new MsSqlCommandGenerator();
return gen;
}

Expand Down
Expand Up @@ -35,11 +35,10 @@ namespace Origam.DA.Service
public class PgSqlCommandGenerator : AbstractSqlCommandGenerator
{

public PgSqlCommandGenerator(IDetachedFieldPacker detachedFieldPacker)
public PgSqlCommandGenerator()
: base(
trueValue: "true",
falseValue: "false",
detachedFieldPacker: detachedFieldPacker,
sqlValueFormatter: new SQLValueFormatter("true", "false", (text) => text.Replace("%", "\\%").Replace("_", "\\_")),
filterRenderer: new PgSqlFilterRenderer(),
new PgSqlRenderer())
Expand Down Expand Up @@ -242,7 +241,7 @@ internal override string MergeSql(string tableName, StringBuilder keysBuilder, S

public override object Clone()
{
PgSqlCommandGenerator gen = new PgSqlCommandGenerator(new DetachedFieldPackerPostgre());
PgSqlCommandGenerator gen = new PgSqlCommandGenerator();
return gen;
}

Expand Down
11 changes: 5 additions & 6 deletions backend/Origam.DA.Service/MsSqlDataService.cs
Expand Up @@ -43,26 +43,25 @@ public class MsSqlDataService : AbstractSqlDataService
private static readonly log4net.ILog log =
log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

private static readonly IDetachedFieldPacker detachedFieldPacker = new DetachedFieldPackerMs();


#region Constructors
public MsSqlDataService() : base(detachedFieldPacker)
{
public MsSqlDataService()
{
Init();
}

public MsSqlDataService(string connection, int bulkInsertThreshold,
int updateBatchSize) : base(connection, bulkInsertThreshold,
updateBatchSize, detachedFieldPacker)
updateBatchSize)
{
Init();
}
#endregion

private void Init()
{
this.DbDataAdapterFactory = new MsSqlCommandGenerator(detachedFieldPacker);
this.DbDataAdapterFactory = new MsSqlCommandGenerator();
}

public override DatabaseType PlatformName
Expand Down