Skip to content

Commit 2fe7641

Browse files
Insert into temp table only for include and revinclude searches (#5209)
* Insert into temp table only for include and revinclude searches * Stop include and revinclude searches with smart v2 scopes with seach parameters
1 parent 8f13105 commit 2fe7641

File tree

5 files changed

+396
-306
lines changed

5 files changed

+396
-306
lines changed

src/Microsoft.Health.Fhir.Core/Resources.Designer.cs

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Microsoft.Health.Fhir.Core/Resources.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,9 @@
251251
<data name="IncludeRevIncludeChainedSearchesDoNotSupportFinerGrainedResourceConstraintsUsingSearchParameters" xml:space="preserve">
252252
<value>Include, RevInclude and Chained searches do not support SMART V2 finer-grained resource constraints using search parameters.</value>
253253
</data>
254+
<data name="IncludeRevIncludeSearchesDoNotSupportFinerGrainedResourceConstraintsUsingSearchParameters" xml:space="preserve">
255+
<value>Include and RevInclude searches do not support SMART V2 finer-grained resource constraints using search parameters.</value>
256+
</data>
254257
<data name="InvalidBooleanConfigSetting" xml:space="preserve">
255258
<value>Field '{0}' with value '{1}' is not supported.</value>
256259
</data>
@@ -844,4 +847,4 @@
844847
<data name="NotReferencedParameterWildcardType" xml:space="preserve">
845848
<value>Not Referenced doesn't allow for a wildcard resource type with a specific search field</value>
846849
</data>
847-
</root>
850+
</root>

src/Microsoft.Health.Fhir.Shared.Core/Features/Search/SearchOptionsFactory.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,15 @@ private void CheckFineGrainedAccessControl(List<Expression> searchExpressions, S
760760
// check resource type restrictions from SMART clinical scopes
761761
if (_contextAccessor.RequestContext?.AccessControlContext?.ApplyFineGrainedAccessControl == true)
762762
{
763+
// Throw 400 if chained, include or revinclude in searchParameters with ApplyFineGrainedAccessControlWithSearchParameters
764+
if (_contextAccessor.RequestContext?.AccessControlContext?.ApplyFineGrainedAccessControlWithSearchParameters == true)
765+
{
766+
if (searchParams.Include.Any() || searchParams.RevInclude.Any())
767+
{
768+
throw new BadRequestException(string.Format(Core.Resources.IncludeRevIncludeSearchesDoNotSupportFinerGrainedResourceConstraintsUsingSearchParameters));
769+
}
770+
}
771+
763772
bool allowAllResourceTypes = false;
764773
var clinicalScopeResources = new List<ResourceType>();
765774
var finalSmartSearchExpressions = new List<Expression>();

src/Microsoft.Health.Fhir.SqlServer/Features/Search/Expressions/Visitors/QueryGenerators/SqlQueryGenerator.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public override object VisitSqlRoot(SqlRootExpression expression, SearchOptions
134134
}
135135

136136
StringBuilder.AppendLine(")");
137+
bool hasIncludeExpressions = expression.SearchParamTableExpressions.Any(t => t.Kind == SearchParamTableExpressionKind.Include);
137138
StringBuilder.AppendLine("DECLARE @FilteredDataSmartV2Union AS TABLE (T1 smallint, Sid1 bigint)");
138139
StringBuilder.AppendLine(";WITH");
139140
StringBuilder.AppendDelimited($"{Environment.NewLine},", expression.SearchParamTableExpressions.SortExpressionsByQueryLogic(), (sb, tableExpression) =>
@@ -144,10 +145,14 @@ public override object VisitSqlRoot(SqlRootExpression expression, SearchOptions
144145
{
145146
// Union expressions for smart v2 scopes with search parameters needs to be handled differently
146147
AppendSmartNewSetOfUnionAllTableExpressions(context, unionExpression, tableExpression.QueryGenerator);
147-
sb.AppendLine();
148-
sb.AppendLine($"INSERT INTO @FilteredDataSmartV2Union SELECT T1, Sid1 FROM cte{_tableExpressionCounter}");
149-
AddOptionClause();
150-
sb.AppendLine($";WITH cte{_tableExpressionCounter} AS (SELECT * FROM @FilteredDataSmartV2Union)");
148+
if (hasIncludeExpressions)
149+
{
150+
sb.AppendLine();
151+
sb.AppendLine($"INSERT INTO @FilteredDataSmartV2Union SELECT T1, Sid1 FROM cte{_tableExpressionCounter}");
152+
AddOptionClause();
153+
sb.AppendLine($";WITH cte{_tableExpressionCounter} AS (SELECT * FROM @FilteredDataSmartV2Union)");
154+
}
155+
151156
_smartV2UnionVisited = true;
152157
}
153158
else

0 commit comments

Comments
 (0)