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

Use JsonScalarExpression for primitive collection indexing #30769

Merged
1 commit merged into from
Apr 27, 2023

Conversation

roji
Copy link
Member

@roji roji commented Apr 26, 2023

Mostly completes #30724, except for full type inference is blocking on #30730.

@roji roji requested a review from maumar April 26, 2023 12:30
// TODO: blocked on #30730: we need to be able to construct a JSON collection type mapping based on the element's.
// For now, hacking to apply the default type mapping instead.
return new JsonScalarExpression(
ApplyDefaultTypeMapping(array), // Hack, until #30730
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that here we'd infer the array's mapping from the element's inferred one, after #30730


internal JsonScalarExpression(
ColumnExpression jsonColumn,
SqlExpression json,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This changes JsonScalarExpression to be over any arbitrary SqlExpression, not necessarily a ColumnExpression and without an IProperty. This is necessary to support indexing over JSON parameter collections.

nullable |= jsonColumnExpression.IsNullable;
}

PathSegment[]? newPath = null;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that VisitChildren didn't visit inside array index expression in the path - added support for that.

@roji roji marked this pull request as draft April 26, 2023 13:32
@roji roji force-pushed the JsonIndexing branch 3 times, most recently from c5e2c85 to 903a989 Compare April 26, 2023 16:43
@roji roji marked this pull request as ready for review April 26, 2023 16:50
{
newSegment = new PathSegment(newArrayIndex);

if (newPath is null)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you do it this way to avoid allocation in case all segments are the same? or is there some other reason? should we switch to this pattern everywhere we visit a collection?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, that's why... And yeah, I've been gradually switching to this pattern for new code I write...

Note that we may be able to extract this out to a utility function so as not to repeat it every time...


// Extract the column projected out of the source, and simplify the subquery to a simple JsonScalarExpression
var shaperExpression = source.ShaperExpression;
if (shaperExpression is UnaryExpression { NodeType: ExpressionType.Convert } unaryExpression
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we use this pattern in few places - consider DRYing (looks like a helpful method not only here but all around the query pipeline)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Absolutely, I had the same thought. There are several repetitive things that are emerging from this - should we revisit that in a separate issue?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, sounds like MQ work

Mostly completes dotnet#30724, except for full type inference is blocking on dotnet#30730.
@ghost
Copy link

ghost commented Apr 27, 2023

Hello @roji!

Because this pull request has the auto-merge label, I will be glad to assist with helping to merge this pull request once all check-in policies pass.

p.s. you can customize the way I help with merging this pull request, such as holding this pull request until a specific person approves. Simply @mention me (@msftbot) and give me an instruction to get started! Learn more here.

@ghost
Copy link

ghost commented Apr 27, 2023

Apologies, while this PR appears ready to be merged, I've been configured to only merge when all checks have explicitly passed. The following integrations have not reported any progress on their checks and are blocking auto-merge:

  1. GitHub Actions

These integrations are possibly never going to report a check, and unblocking auto-merge likely requires a human being to update my configuration to exempt these integrations from requiring a passing check.

Give feedback on this
From the bot dev team

We've tried to tune the bot such that it posts a comment like this only when auto-merge is blocked for exceptional, non-intuitive reasons. When the bot's auto-merge capability is properly configured, auto-merge should operate as you would intuitively expect and you should not see any spurious comments.

Please reach out to us at [email protected] to provide feedback if you believe you're seeing this comment appear spuriously. Please note that we usually are unable to update your bot configuration on your team's behalf, but we're happy to help you identify your bot admin.

1 similar comment
@ghost
Copy link

ghost commented Apr 27, 2023

Apologies, while this PR appears ready to be merged, I've been configured to only merge when all checks have explicitly passed. The following integrations have not reported any progress on their checks and are blocking auto-merge:

  1. GitHub Actions

These integrations are possibly never going to report a check, and unblocking auto-merge likely requires a human being to update my configuration to exempt these integrations from requiring a passing check.

Give feedback on this
From the bot dev team

We've tried to tune the bot such that it posts a comment like this only when auto-merge is blocked for exceptional, non-intuitive reasons. When the bot's auto-merge capability is properly configured, auto-merge should operate as you would intuitively expect and you should not see any spurious comments.

Please reach out to us at [email protected] to provide feedback if you believe you're seeing this comment appear spuriously. Please note that we usually are unable to update your bot configuration on your team's behalf, but we're happy to help you identify your bot admin.

@ghost
Copy link

ghost commented Apr 27, 2023

Apologies, while this PR appears ready to be merged, I've been configured to only merge when all checks have explicitly passed. The following integrations have not reported any progress on their checks and are blocking auto-merge:

  1. Azure Pipelines

These integrations are possibly never going to report a check, and unblocking auto-merge likely requires a human being to update my configuration to exempt these integrations from requiring a passing check.

Give feedback on this
From the bot dev team

We've tried to tune the bot such that it posts a comment like this only when auto-merge is blocked for exceptional, non-intuitive reasons. When the bot's auto-merge capability is properly configured, auto-merge should operate as you would intuitively expect and you should not see any spurious comments.

Please reach out to us at [email protected] to provide feedback if you believe you're seeing this comment appear spuriously. Please note that we usually are unable to update your bot configuration on your team's behalf, but we're happy to help you identify your bot admin.

@ghost ghost merged commit 7b1ef88 into dotnet:main Apr 27, 2023
@roji roji deleted the JsonIndexing branch April 28, 2023 08:17
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants