Skip to content

Commit

Permalink
Call logical step flattening outside of And/OrSteps. This saves a ToA…
Browse files Browse the repository at this point in the history
…rray roundtrip.
  • Loading branch information
danielcweber committed Aug 28, 2024
1 parent d50674f commit 9133e14
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/Core/Queries/GremlinQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ private static GremlinQuery<T1, T2, T3, T4> And(MultiContinuationBuilder<Gremlin
else
{
builder = builder
.AddStep(new AndStep(fusedTraversals.ToArray()));
.AddStep(new AndStep(LogicalStep<AndStep>.FlattenLogicalTraversals(fusedTraversals)));
}

return builder
Expand Down Expand Up @@ -821,7 +821,7 @@ private static GremlinQuery<T1, T2, T3, T4> Or(MultiContinuationBuilder<GremlinQ
1 => builder.OuterQuery
.Where(fusedTraversals[0]),
_ => builder
.AddStep(new OrStep(fusedTraversals.ToArray()))
.AddStep(new OrStep(LogicalStep<OrStep>.FlattenLogicalTraversals(fusedTraversals)))
.Build()
};
});
Expand Down
1 change: 1 addition & 0 deletions src/Core/Steps/AndStep.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{
public sealed class AndStep : LogicalStep<AndStep>, IFilterStep
{
//TODO: Change to ImmutableArray
public AndStep(IEnumerable<Traversal> traversals) : base("and", traversals)
{
}
Expand Down
28 changes: 16 additions & 12 deletions src/Core/Steps/LogicalStep.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@ namespace ExRam.Gremlinq.Core.Steps
public abstract class LogicalStep<TStep> : Step
where TStep : LogicalStep<TStep>
{
protected LogicalStep(string name, IEnumerable<Traversal> traversals) : this(
name,
traversals
.SelectMany(FlattenLogicalTraversals)
.ToImmutableArray())
protected LogicalStep(string name, IEnumerable<Traversal> traversals) : this(name, traversals.ToImmutableArray())
{
}

Expand All @@ -19,20 +15,28 @@ private LogicalStep(string name, ImmutableArray<Traversal> traversals) : base(tr
Traversals = traversals;
}

private static IEnumerable<Traversal> FlattenLogicalTraversals(Traversal traversal)
internal static ImmutableArray<Traversal> FlattenLogicalTraversals(ReadOnlySpan<Traversal> traversals)
{
if (traversal is [TStep otherStep])
var builder = ImmutableArray.CreateBuilder<Traversal>();

FlattenLogicalTraversals(builder, traversals);

return builder.ToImmutableArray();

static void FlattenLogicalTraversals(ImmutableArray<Traversal>.Builder builder, ReadOnlySpan<Traversal> traversals)
{
foreach (var subTraversal in otherStep.Traversals)
for (var i = 0; i < traversals.Length; i++)
{
foreach (var flattenedSubTraversal in FlattenLogicalTraversals(subTraversal))
var traversal = traversals[i];

if (traversal is [TStep otherStep])
{
yield return flattenedSubTraversal;
FlattenLogicalTraversals(builder, otherStep.Traversals.AsSpan());
}
else
builder.Add(traversal);
}
}
else
yield return traversal;
}

//TODO: Seemingly unused.
Expand Down
1 change: 1 addition & 0 deletions src/Core/Steps/OrStep.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{
public sealed class OrStep : LogicalStep<OrStep>, IFilterStep
{
//TODO: Change to ImmutableArray
public OrStep(IEnumerable<Traversal> traversals) : base("or", traversals)
{
}
Expand Down

0 comments on commit 9133e14

Please sign in to comment.