Skip to content

Commit f56affe

Browse files
committed
Revert "adds single round trip approach for mssql"
This reverts commit 641f1c5.
1 parent 641f1c5 commit f56affe

14 files changed

Lines changed: 53 additions & 152 deletions

src/Core/Resolvers/AuthorizationPolicyHelpers.cs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,7 @@ public static void ProcessAuthorizationPolicies(
4646
}
4747

4848
string clientRoleHeader = roleHeaderValue.ToString();
49-
HashSet<EntityActionOperation> elementalOperations = ResolveCompoundOperationToElementalOperations(operationType).ToHashSet();
50-
51-
// add appropriate comments here
52-
if(queryStructure.ApiRequestType is ApiType.REST &&
53-
sqlMetadataProvider.GetDatabaseType() is DatabaseType.MSSQL &&
54-
sqlMetadataProvider.EntityToDatabaseObject[queryStructure.EntityName].SourceType is not EntitySourceType.StoredProcedure)
55-
{
56-
elementalOperations.Add(EntityActionOperation.Read);
57-
}
49+
List<EntityActionOperation> elementalOperations = ResolveCompoundOperationToElementalOperations(operationType);
5850

5951
foreach (EntityActionOperation elementalOperation in elementalOperations)
6052
{

src/Core/Resolvers/BaseQueryStructure.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
using Azure.DataApiBuilder.Auth;
55
using Azure.DataApiBuilder.Config.DatabasePrimitives;
6-
using Azure.DataApiBuilder.Config.ObjectModel;
76
using Azure.DataApiBuilder.Core.Models;
87
using Azure.DataApiBuilder.Core.Services;
98
using Azure.DataApiBuilder.Service.GraphQLBuilder;
@@ -14,12 +13,6 @@ namespace Azure.DataApiBuilder.Core.Resolvers
1413
{
1514
public class BaseQueryStructure
1615
{
17-
18-
/// <summary>
19-
/// Type of the API request - REST or GraphQL.
20-
/// </summary>
21-
public ApiType ApiRequestType { get; set; }
22-
2316
/// <summary>
2417
/// The Entity name associated with this query as appears in the config file.
2518
/// </summary>
@@ -82,8 +75,7 @@ public BaseQueryStructure(
8275
GQLFilterParser gQLFilterParser,
8376
List<Predicate>? predicates = null,
8477
string entityName = "",
85-
IncrementingInteger? counter = null,
86-
ApiType apiRequestType = ApiType.GraphQL)
78+
IncrementingInteger? counter = null)
8779
{
8880
Columns = new();
8981
Parameters = new();
@@ -92,7 +84,6 @@ public BaseQueryStructure(
9284
MetadataProvider = metadataProvider;
9385
GraphQLFilterParser = gQLFilterParser;
9486
AuthorizationResolver = authorizationResolver;
95-
ApiRequestType = apiRequestType;
9687

9788
// Default the alias to the empty string since this base constructor
9889
// is called for requests other than Find operations. We only use

src/Core/Resolvers/MsSqlQueryBuilder.cs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,13 @@ public string Build(SqlInsertStructure structure)
7575
// Columns whose values are provided in the request body - to be inserted into the record.
7676
string insertColumns = Build(structure.InsertColumns);
7777

78-
// add appropriate comments here
79-
string selectQueryPredicates = JoinPredicateStrings(structure.GetDbPolicyForOperation(EntityActionOperation.Read));
80-
8178
// Values to be inserted into the entity.
8279
string values = dbPolicypredicates.Equals(BASE_PREDICATE) ?
8380
$"VALUES ({string.Join(", ", structure.Values)});" : $"SELECT {insertColumns} FROM (VALUES({string.Join(", ", structure.Values)})) T({insertColumns}) WHERE {dbPolicypredicates};";
8481

8582
// Final insert query to be executed against the database.
8683
StringBuilder insertQuery = new();
87-
if (structure.ApiRequestType is ApiType.GraphQL && !isInsertDMLTriggerEnabled)
84+
if (!isInsertDMLTriggerEnabled)
8885
{
8986
// When there is no DML trigger enabled on the table for insert operation, we can use OUTPUT clause to return the data.
9087
insertQuery.Append($"INSERT INTO {tableName} ({insertColumns}) OUTPUT " +
@@ -145,12 +142,7 @@ public string Build(SqlInsertStructure structure)
145142
// If there is an autogenerated column in the PK, we will add an additional WHERE condition for it.
146143
// Using SCOPE_IDENTITY() method provided by sql server,
147144
// we can get the last generated value of the autogenerated column.
148-
subsequentSelect.Append($"WHERE {tableName}.{QuoteIdentifier(autoGenPKColumn)} = SCOPE_IDENTITY() ");
149-
subsequentSelect.Append($"AND {selectQueryPredicates}");
150-
}
151-
else
152-
{
153-
subsequentSelect.Append($"WHERE {selectQueryPredicates}");
145+
subsequentSelect.Append($"WHERE {tableName}.{QuoteIdentifier(autoGenPKColumn)} = SCOPE_IDENTITY()");
154146
}
155147

156148
insertQuery.Append(subsequentSelect.ToString());
@@ -273,11 +265,9 @@ public string Build(SqlUpsertQueryStructure structure)
273265
// Predicates by virtue of PK + database policy.
274266
string updatePredicates = JoinPredicateStrings(pkPredicates, structure.GetDbPolicyForOperation(EntityActionOperation.Update));
275267

276-
string selectPredicates = JoinPredicateStrings(pkPredicates, structure.GetDbPolicyForOperation(EntityActionOperation.Read));
277-
278268
string updateOperations = Build(structure.UpdateOperations, ", ");
279269
string columnsToBeReturned =
280-
MakeOutputColumns(structure.OutputColumns, (isUpdateTriggerEnabled || structure.ApiRequestType is ApiType.REST ) ? string.Empty : OutputQualifier.Inserted.ToString());
270+
MakeOutputColumns(structure.OutputColumns, isUpdateTriggerEnabled ? string.Empty : OutputQualifier.Inserted.ToString());
281271
string queryToGetCountOfRecordWithPK = $"SELECT COUNT(*) as {COUNT_ROWS_WITH_GIVEN_PK} FROM {tableName} WHERE {pkPredicates}";
282272

283273
// Query to get the number of records with a given PK.
@@ -295,13 +285,13 @@ public string Build(SqlUpsertQueryStructure structure)
295285
$"UPDATE {tableName} " +
296286
$"SET {updateOperations} ");
297287

298-
if (structure.ApiRequestType is ApiType.REST || isUpdateTriggerEnabled)
288+
if (isUpdateTriggerEnabled)
299289
{
300290
// If a trigger is enabled on the entity, we cannot use OUTPUT clause to return the record.
301291
// In such a case, we will use a subsequent select query to get the record. By the time the subsequent select executes,
302292
// the trigger would have already executed and we get the data as it is present in the table.
303293
updateQuery.Append($"WHERE {updatePredicates};");
304-
string subsequentSelect = $"SELECT {columnsToBeReturned} FROM {tableName} WHERE {selectPredicates};";
294+
string subsequentSelect = $"SELECT {columnsToBeReturned} FROM {tableName} WHERE {updatePredicates};";
305295
updateQuery.Append(subsequentSelect);
306296
}
307297
else
@@ -331,9 +321,8 @@ public string Build(SqlUpsertQueryStructure structure)
331321

332322
bool isInsertTriggerEnabled = sourceDefinition.IsInsertDMLTriggerEnabled;
333323
// We can only use OUTPUT clause to return inserted data when there is no trigger enabled on the entity.
334-
if (!isInsertTriggerEnabled && structure.ApiRequestType is ApiType.GraphQL)
324+
if (!isInsertTriggerEnabled)
335325
{
336-
// use output clause here
337326
if (isUpdateTriggerEnabled)
338327
{
339328
// This is just an optimisation. If update trigger is enabled, then this build method had created
@@ -343,10 +332,9 @@ public string Build(SqlUpsertQueryStructure structure)
343332

344333
insertQuery.Append($"OUTPUT {columnsToBeReturned}");
345334
}
346-
347335
// If an insert trigger is enabled but there was no update trigger enabled,
348336
// we need to generate columnsToBeReturned without the 'Inserted' prefix on each column.
349-
else if (isInsertTriggerEnabled && !isUpdateTriggerEnabled)
337+
else if (!isUpdateTriggerEnabled)
350338
{
351339
// This is again just an optimisation. If update trigger was enabled, then the columnsToBeReturned would
352340
// have already been created without any prefix.
@@ -361,11 +349,11 @@ public string Build(SqlUpsertQueryStructure structure)
361349
// Append the values to be inserted to the insertQuery.
362350
insertQuery.Append(fetchColumnValuesQuery);
363351

364-
if (isInsertTriggerEnabled || structure.ApiRequestType is ApiType.REST)
352+
if (isInsertTriggerEnabled)
365353
{
366354
// Since a trigger is enabled, a subsequent select query is to be executed to get the inserted record.
367355
// By the time the subsequent select executes, the trigger would have already executed and we get the data as it is present in the table.
368-
string subsequentSelect = $"SELECT {columnsToBeReturned} from {tableName} WHERE {pkPredicates} AND {selectPredicates};";
356+
string subsequentSelect = $"SELECT {columnsToBeReturned} from {tableName} WHERE {pkPredicates};";
369357
insertQuery.Append(subsequentSelect);
370358
}
371359

src/Core/Resolvers/MsSqlQueryExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public override async Task<DbResultSet> GetMultipleResultSetsIfAnyAsync(
289289
statusCode: HttpStatusCode.Forbidden,
290290
subStatusCode: DataApiBuilderException.SubStatusCodes.DatabasePolicyFailure);
291291
}
292-
292+
293293
// This is used as an identifier to distinguish between update/insert operations.
294294
// Later helps to add location header in case of insert operation.
295295
dbResultSet.ResultProperties.Add(SqlMutationEngine.IS_UPDATE_RESULT_SET, true);

src/Core/Resolvers/Sql Query Structures/BaseSqlQueryStructure.cs

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,17 @@ public abstract class BaseSqlQueryStructure : BaseQueryStructure
5555
/// </summary>
5656
public HashSet<string> FieldsReferencedInDbPolicyForCreateAction { get; set; } = new();
5757

58-
/// <summary>
59-
///
60-
/// </summary>
61-
protected string RoleName { get; set; } = "";
62-
6358
public BaseSqlQueryStructure(
6459
ISqlMetadataProvider metadataProvider,
6560
IAuthorizationResolver authorizationResolver,
6661
GQLFilterParser gQLFilterParser,
67-
ApiType apiRequestType,
6862
List<Predicate>? predicates = null,
6963
string entityName = "",
7064
IncrementingInteger? counter = null,
7165
HttpContext? httpContext = null,
7266
EntityActionOperation operationType = EntityActionOperation.None
7367
)
74-
: base(metadataProvider, authorizationResolver, gQLFilterParser, predicates, entityName, counter, apiRequestType)
68+
: base(metadataProvider, authorizationResolver, gQLFilterParser, predicates, entityName, counter)
7569
{
7670
Joins = new();
7771

@@ -80,8 +74,6 @@ public BaseSqlQueryStructure(
8074
// For GraphQL read operation, the database policy predicates are added later in the Sql{*}QueryStructure classes.
8175
if (httpContext is not null)
8276
{
83-
RoleName = httpContext.Request.Headers["X-MS-API-ROLE"];
84-
8577
AuthorizationPolicyHelpers.ProcessAuthorizationPolicies(
8678
operationType,
8779
this,
@@ -326,49 +318,22 @@ public List<string> AllColumns()
326318
protected List<LabelledColumn> GenerateOutputColumns()
327319
{
328320
List<LabelledColumn> outputColumns = new();
329-
330-
// add comments here
331-
if(ApiRequestType is ApiType.REST &&
332-
MetadataProvider.GetDatabaseType() is DatabaseType.MSSQL &&
333-
MetadataProvider.EntityToDatabaseObject[EntityName].SourceType is not EntitySourceType.StoredProcedure)
321+
foreach (string columnName in GetUnderlyingSourceDefinition().Columns.Keys)
334322
{
335-
foreach (string columnName in AuthorizationResolver.GetAllowedExposedColumns(EntityName, RoleName, EntityActionOperation.Read))
323+
if (!MetadataProvider.TryGetExposedColumnName(
324+
entityName: EntityName,
325+
backingFieldName: columnName,
326+
out string? exposedName))
336327
{
337-
if (!MetadataProvider.TryGetExposedColumnName(
338-
entityName: EntityName,
339-
backingFieldName: columnName,
340-
out string? exposedName))
341-
{
342-
continue;
343-
}
344-
345-
outputColumns.Add(new(
346-
tableSchema: DatabaseObject.SchemaName,
347-
tableName: DatabaseObject.Name,
348-
columnName: columnName,
349-
label: exposedName!,
350-
tableAlias: SourceAlias));
328+
continue;
351329
}
352-
}
353-
else
354-
{
355-
foreach (string columnName in GetUnderlyingSourceDefinition().Columns.Keys)
356-
{
357-
if (!MetadataProvider.TryGetExposedColumnName(
358-
entityName: EntityName,
359-
backingFieldName: columnName,
360-
out string? exposedName))
361-
{
362-
continue;
363-
}
364330

365-
outputColumns.Add(new(
366-
tableSchema: DatabaseObject.SchemaName,
367-
tableName: DatabaseObject.Name,
368-
columnName: columnName,
369-
label: exposedName!,
370-
tableAlias: SourceAlias));
371-
}
331+
outputColumns.Add(new(
332+
tableSchema: DatabaseObject.SchemaName,
333+
tableName: DatabaseObject.Name,
334+
columnName: columnName,
335+
label: exposedName!,
336+
tableAlias: SourceAlias));
372337
}
373338

374339
return outputColumns;

src/Core/Resolvers/Sql Query Structures/SqlDeleteQueryStructure.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,12 @@ public SqlDeleteStructure(
2323
IAuthorizationResolver authorizationResolver,
2424
GQLFilterParser gQLFilterParser,
2525
IDictionary<string, object?> mutationParams,
26-
HttpContext httpContext,
27-
ApiType apiRequestType)
26+
HttpContext httpContext)
2827
: base(
2928
metadataProvider: sqlMetadataProvider,
3029
authorizationResolver: authorizationResolver,
3130
gQLFilterParser: gQLFilterParser,
3231
entityName: entityName,
33-
apiRequestType: apiRequestType,
3432
httpContext: httpContext,
3533
operationType: EntityActionOperation.Delete)
3634
{

src/Core/Resolvers/Sql Query Structures/SqlExecuteQueryStructure.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Net;
55
using Azure.DataApiBuilder.Auth;
66
using Azure.DataApiBuilder.Config.DatabasePrimitives;
7-
using Azure.DataApiBuilder.Config.ObjectModel;
87
using Azure.DataApiBuilder.Core.Models;
98
using Azure.DataApiBuilder.Core.Services;
109
using Azure.DataApiBuilder.Service.Exceptions;
@@ -32,9 +31,8 @@ public SqlExecuteStructure(
3231
ISqlMetadataProvider sqlMetadataProvider,
3332
IAuthorizationResolver authorizationResolver,
3433
GQLFilterParser gQLFilterParser,
35-
IDictionary<string, object?> requestParams,
36-
ApiType apiRequestType)
37-
: base(sqlMetadataProvider, authorizationResolver, gQLFilterParser, entityName: entityName, apiRequestType: apiRequestType)
34+
IDictionary<string, object?> requestParams)
35+
: base(sqlMetadataProvider, authorizationResolver, gQLFilterParser, entityName: entityName)
3836
{
3937
StoredProcedureDefinition storedProcedureDefinition = GetUnderlyingStoredProcedureDefinition();
4038
ProcedureParameters = new();

src/Core/Resolvers/Sql Query Structures/SqlInsertQueryStructure.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ HttpContext httpContext
4848
authorizationResolver,
4949
gQLFilterParser,
5050
GQLMutArgumentToDictParams(context, CreateMutationBuilder.INPUT_ARGUMENT_NAME, mutationParams),
51-
httpContext,
52-
ApiType.GraphQL)
51+
httpContext)
5352
{ }
5453

5554
public SqlInsertStructure(
@@ -58,14 +57,12 @@ public SqlInsertStructure(
5857
IAuthorizationResolver authorizationResolver,
5958
GQLFilterParser gQLFilterParser,
6059
IDictionary<string, object?> mutationParams,
61-
HttpContext httpContext,
62-
ApiType apiRequestType
60+
HttpContext httpContext
6361
)
6462
: base(
6563
metadataProvider: sqlMetadataProvider,
6664
authorizationResolver: authorizationResolver,
6765
gQLFilterParser: gQLFilterParser,
68-
apiRequestType: apiRequestType,
6966
entityName: entityName,
7067
httpContext: httpContext,
7168
operationType: EntityActionOperation.Create)

src/Core/Resolvers/Sql Query Structures/SqlQueryStructure.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ public SqlQueryStructure(
138138
predicates: null,
139139
entityName: context.EntityName,
140140
counter: new IncrementingInteger(),
141-
httpContext: httpContext,
142-
apiRequestType: ApiType.REST)
141+
httpContext: httpContext)
143142
{
144143
IsListQuery = context.IsMany;
145144
SourceAlias = $"{DatabaseObject.SchemaName}_{DatabaseObject.Name}";
@@ -261,8 +260,7 @@ private SqlQueryStructure(
261260
gQLFilterParser,
262261
predicates: null,
263262
entityName: entityName,
264-
counter: counter,
265-
apiRequestType: ApiType.GraphQL
263+
counter: counter
266264
)
267265
{
268266
_ctx = ctx;
@@ -417,16 +415,13 @@ private SqlQueryStructure(
417415
ISqlMetadataProvider metadataProvider,
418416
IAuthorizationResolver authorizationResolver,
419417
GQLFilterParser gQLFilterParser,
420-
ApiType apiRequestType,
421418
List<Predicate>? predicates = null,
422419
string entityName = "",
423420
IncrementingInteger? counter = null,
424421
HttpContext? httpContext = null)
425422
: base(metadataProvider,
426423
authorizationResolver,
427-
gQLFilterParser,
428-
apiRequestType,
429-
predicates,
424+
gQLFilterParser, predicates,
430425
entityName,
431426
counter,
432427
httpContext,

src/Core/Resolvers/Sql Query Structures/SqlUpdateQueryStructure.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,13 @@ public SqlUpdateStructure(
3434
ISqlMetadataProvider sqlMetadataProvider,
3535
IAuthorizationResolver authorizationResolver,
3636
GQLFilterParser gQLFilterParser,
37-
ApiType apiRequestType,
3837
IDictionary<string, object?> mutationParams,
3938
HttpContext httpContext,
4039
bool isIncrementalUpdate)
4140
: base(
4241
metadataProvider: sqlMetadataProvider,
4342
authorizationResolver: authorizationResolver,
4443
gQLFilterParser: gQLFilterParser,
45-
apiRequestType: apiRequestType,
4644
entityName: entityName,
4745
httpContext: httpContext,
4846
operationType: EntityActionOperation.Update)
@@ -102,7 +100,6 @@ public SqlUpdateStructure(
102100
metadataProvider: sqlMetadataProvider,
103101
authorizationResolver: authorizationResolver,
104102
gQLFilterParser: gQLFilterParser,
105-
apiRequestType: ApiType.GraphQL,
106103
entityName: entityName,
107104
httpContext: httpContext,
108105
operationType: EntityActionOperation.Update)

0 commit comments

Comments
 (0)