Skip to content

Commit 76f868e

Browse files
Merge pull request #408 from vitorortuondo/Hana_support
Added Hana support to BatchDelete and BatchUpdate.
2 parents 68d67e4 + dad7687 commit 76f868e

File tree

2 files changed

+62
-34
lines changed

2 files changed

+62
-34
lines changed

src/shared/Z.EF.Plus.BatchDelete.Shared/BatchDelete.cs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,22 @@ DELETE FROM {TableName} AS A
7777
USING ( {Select} ) AS B WHERE {PrimaryKeys}
7878
";
7979

80-
/// <summary>The command text postgre SQL template.</summary>
80+
/// <summary>The command text MySQL template.</summary>
8181
internal const string CommandTextTemplate_MySql = @"
8282
DELETE A
8383
FROM {TableName} AS A
8484
INNER JOIN ( {Select} ) AS B ON {PrimaryKeys}
8585
";
8686

87+
/// <summary>The command text Hana template.</summary>
88+
internal const string CommandTextTemplate_Hana = @"
89+
DELETE
90+
FROM {TableName}
91+
WHERE EXISTS ( SELECT 1 FROM ({Select}) B
92+
WHERE {PrimaryKeys}
93+
)
94+
";
95+
8796
/// <summary>The command text template with WHILE loop.</summary>
8897
internal const string CommandTextWhileTemplate = @"
8998
DECLARE @stop int
@@ -265,6 +274,11 @@ public int Execute<T>(IQueryable<T> query) where T : class
265274
int totalRowAffecteds = command.ExecuteNonQuery();
266275
return totalRowAffecteds;
267276
}
277+
else if (command.Connection.GetType().Name.Contains("Hana"))
278+
{
279+
int totalRowAffecteds = command.ExecuteNonQuery();
280+
return totalRowAffecteds;
281+
}
268282
else
269283
{
270284
var rowAffecteds = (int)command.ExecuteScalar();
@@ -284,7 +298,7 @@ public int Execute<T>(IQueryable<T> query) where T : class
284298
int totalRowAffecteds = DbInterception.Dispatch.Command.NonQuery(command, interceptionContext);
285299
return totalRowAffecteds;
286300
}
287-
else if (command.Connection.GetType().Name.Contains("Oracle") || command.Connection.GetType().Name.Contains("SQLite"))
301+
else if (command.Connection.GetType().Name.Contains("Oracle") || command.Connection.GetType().Name.Contains("SQLite") || command.Connection.GetType().Name.Contains("Hana"))
288302
{
289303
int totalRowAffecteds = DbInterception.Dispatch.Command.NonQuery(command, interceptionContext);
290304
return totalRowAffecteds;
@@ -393,6 +407,7 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
393407
var isSqlCe = command.GetType().Name == "SqlCeCommand";
394408
var isOracle = command.GetType().Namespace.Contains("Oracle");
395409
var isSQLite = command.GetType().Namespace.Contains("SQLite");
410+
var isHana = command.GetType().Namespace.Contains("Hana");
396411

397412
// Oracle BindByName
398413
if (isOracle)
@@ -424,7 +439,7 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
424439
{
425440
tableName = string.Concat("\"", store.Table, "\"");
426441
}
427-
else if (isOracle)
442+
else if (isOracle || isHana)
428443
{
429444
tableName = string.IsNullOrEmpty(store.Schema) || store.Schema == "dbo" ?
430445
string.Concat("\"", store.Table, "\"") :
@@ -458,16 +473,13 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
458473
}
459474

460475
// GET command text template
461-
var commandTextTemplate = isPostgreSql ?
462-
CommandTextPostgreSQLTemplate :
463-
isOracle ?
464-
CommandTextOracleTemplate :
465-
isMySql ?
466-
CommandTextTemplate_MySql :
467-
isSqlCe ?
468-
CommandTextSqlCeTemplate :
469-
isSQLite ?
470-
CommandTextSQLiteTemplate :
476+
var commandTextTemplate =
477+
isPostgreSql ? CommandTextPostgreSQLTemplate :
478+
isOracle ? CommandTextOracleTemplate :
479+
isMySql ? CommandTextTemplate_MySql :
480+
isSqlCe ? CommandTextSqlCeTemplate :
481+
isSQLite ? CommandTextSQLiteTemplate :
482+
isHana ? CommandTextTemplate_Hana :
471483
BatchSize > 0 ?
472484
BatchDelayInterval > 0 ?
473485
CommandTextWhileDelayTemplate :
@@ -491,13 +503,13 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
491503

492504
// GET primary key join
493505
string primaryKeys;
494-
if (isSqlCe || isOracle || isSQLite)
506+
if (isSqlCe || isOracle || isSQLite || isHana)
495507
{
496-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle), " = B.", EscapeName(x, isMySql, isOracle), "")));
508+
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isHana), " = B.", EscapeName(x, isMySql, isOracle, isHana), "")));
497509
}
498510
else
499511
{
500-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.", EscapeName(x, isMySql, isOracle), " = B.", EscapeName(x, isMySql, isOracle), "")));
512+
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.", EscapeName(x, isMySql, isOracle, isHana), " = B.", EscapeName(x, isMySql, isOracle, isHana), "")));
501513
}
502514

503515
// REPLACE template
@@ -777,10 +789,10 @@ public DbCommand CreateCommand(IQueryable query, IEntityType entity)
777789
return command;
778790
}
779791
#endif
780-
public string EscapeName(string name, bool isMySql, bool isOracle)
792+
public string EscapeName(string name, bool isMySql, bool isOracle, bool isHana)
781793
{
782794
return isMySql ? string.Concat("`", name, "`") :
783-
isOracle ? string.Concat("\"", name, "\"") :
795+
isOracle || isHana ? string.Concat("\"", name, "\"") :
784796
string.Concat("[", name, "]");
785797
}
786798
}

src/shared/Z.EF.Plus.BatchUpdate.Shared/BatchUpdate.cs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ INNER JOIN ( {Select}
9292
SET {SetValue}
9393
";
9494

95+
internal const string CommandTextTemplate_Hana = @"
96+
UPDATE {TableName}
97+
SET {SetValue}
98+
WHERE EXISTS ( SELECT 1 FROM ({Select}) B
99+
WHERE {PrimaryKeys}
100+
)
101+
";
102+
95103
#if TODO
96104
/// <summary>The command text template with WHILE loop.</summary>
97105
internal const string CommandTextWhileTemplate = @"
@@ -399,6 +407,7 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
399407
var isOracle = command.GetType().Namespace.Contains("Oracle");
400408
var isPostgreSQL = command.GetType().Name == "NpgsqlCommand";
401409
var isSQLite = command.GetType().Namespace.Contains("SQLite");
410+
var isHana = command.GetType().Namespace.Contains("Hana");
402411

403412
// Oracle BindByName
404413
if (isOracle)
@@ -442,6 +451,12 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
442451
{
443452
tableName = string.Concat("\"", store.Table, "\"");
444453
}
454+
else if (isHana)
455+
{
456+
tableName = string.IsNullOrEmpty(store.Schema) ?
457+
string.Concat("\"", store.Table, "\"") :
458+
string.Concat("\"", store.Schema, "\".\"", store.Table, "\"");
459+
}
445460
else
446461
{
447462
tableName = string.IsNullOrEmpty(store.Schema) ?
@@ -478,6 +493,7 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
478493
isMySql ? CommandTextTemplate_MySQL :
479494
isSqlCe ? CommandTextTemplateSqlCe :
480495
isSQLite ? CommandTextTemplate_SQLite :
496+
isHana ? CommandTextTemplate_Hana :
481497
CommandTextTemplate;
482498

483499
// GET inner query
@@ -496,38 +512,38 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
496512

497513
if (isSqlCe)
498514
{
499-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isPostgreSQL), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL), "")));
515+
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), "")));
500516

501517
setValues = string.Join("," + Environment.NewLine, values.Select((x, i) => x.Item2 is ConstantExpression ?
502-
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = ", ((ConstantExpression) x.Item2).Value.ToString().Replace("B.[", "[")) :
503-
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = @zzz_BatchUpdate_", i)));
518+
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = ", ((ConstantExpression) x.Item2).Value.ToString().Replace("B.[", "[")) :
519+
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = @zzz_BatchUpdate_", i)));
504520
}
505-
else if (isOracle || isPostgreSQL)
521+
else if (isOracle || isPostgreSQL || isHana)
506522
{
507-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isPostgreSQL), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL), "")));
523+
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), "")));
508524

509525
// GET updateSetValues
510526
setValues = string.Join("," + Environment.NewLine, values.Select((x, i) => x.Item2 is ConstantExpression ?
511-
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = ", ((ConstantExpression)x.Item2).Value) :
512-
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = :zzz_BatchUpdate_", i)));
527+
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = ", ((ConstantExpression)x.Item2).Value) :
528+
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = :zzz_BatchUpdate_", i)));
513529
}
514530
else if (isSQLite)
515531
{
516-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isPostgreSQL), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL), "")));
532+
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat(tableName + ".", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), "")));
517533

518534
// GET updateSetValues
519535
setValues = string.Join("," + Environment.NewLine, values.Select((x, i) => x.Item2 is ConstantExpression ?
520-
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = ", ((ConstantExpression)x.Item2).Value) :
521-
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = @zzz_BatchUpdate_", i)));
536+
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = ", ((ConstantExpression)x.Item2).Value) :
537+
string.Concat(EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = @zzz_BatchUpdate_", i)));
522538
}
523539
else
524540
{
525-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.", EscapeName(x, isMySql, isOracle, isPostgreSQL), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL), "")));
541+
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), " = B.", EscapeName(x, isMySql, isOracle, isPostgreSQL, isHana), "")));
526542

527543
// GET updateSetValues
528544
setValues = string.Join("," + Environment.NewLine, values.Select((x, i) => x.Item2 is ConstantExpression ?
529-
string.Concat("A.", EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = ", ((ConstantExpression) x.Item2).Value) :
530-
string.Concat("A.", EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL), " = @zzz_BatchUpdate_", i)));
545+
string.Concat("A.", EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = ", ((ConstantExpression) x.Item2).Value) :
546+
string.Concat("A.", EscapeName(x.Item1, isMySql, isOracle, isPostgreSQL, isHana), " = @zzz_BatchUpdate_", i)));
531547
}
532548

533549
// REPLACE template
@@ -569,7 +585,7 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
569585
continue;
570586
}
571587

572-
var parameterPrefix = isOracle ? ":" : "@";
588+
var parameterPrefix = isOracle ? ":" : isHana ? "" : "@";
573589
574590
var parameter = command.CreateParameter();
575591
parameter.ParameterName = parameterPrefix + "zzz_BatchUpdate_" + i;
@@ -1222,10 +1238,10 @@ public List<Tuple<string, object>> GetInnerValues<T>(IQueryable<T> query, Expres
12221238
return destinationValues;
12231239
}
12241240

1225-
public string EscapeName(string name, bool isMySql, bool isOracle, bool isPostgreSQL)
1241+
public string EscapeName(string name, bool isMySql, bool isOracle, bool isPostgreSQL, bool isHana)
12261242
{
12271243
return isMySql ? string.Concat("`", name, "`") :
1228-
isOracle || isPostgreSQL ? string.Concat("\"", name, "\"") :
1244+
isOracle || isPostgreSQL || isHana ? string.Concat("\"", name, "\"") :
12291245
string.Concat("[", name, "]");
12301246
}
12311247

0 commit comments

Comments
 (0)