Skip to content

Commit

Permalink
Handle null values before serialization at a central place.
Browse files Browse the repository at this point in the history
  • Loading branch information
danielcweber committed Sep 21, 2022
1 parent 163a9f8 commit 3e16abf
Showing 1 changed file with 16 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,7 @@ public IGremlinQueryFragmentSerializer Override<TFragment>(GremlinQueryFragmentS
step.ThenTraversal))
.Override<CoalesceStep>(static (step, env, _, recurse) => CreateInstruction("coalesce", recurse, env, step.Traversals))
.Override<CoinStep>(static (step, env, _, recurse) => CreateInstruction("coin", recurse, env, step.Probability))
.Override<ConstantStep>(static (step, env, _, recurse) => step.Value is { } value
? CreateInstruction("constant", recurse, env, value)
: new Instruction("constant", new [] { default(object?) }))
.Override<ConstantStep>(static (step, env, _, recurse) => CreateInstruction("constant", recurse, env, step.Value))
.Override<CountStep>(static (step, env, _, recurse) => step.Scope.Equals(Scope.Local)
? CreateInstruction("count", recurse, env, step.Scope)
: CreateInstruction("count"))
Expand Down Expand Up @@ -492,39 +490,46 @@ private static Instruction CreateInstruction<TParam>(string name, IGremlinQueryF
{
return new(
name,
recurse.Serialize(parameter, env));
recurse.NullAwareSerialize(parameter, env));
}

private static Instruction CreateInstruction<TParam1, TParam2>(string name, IGremlinQueryFragmentSerializer recurse, IGremlinQueryEnvironment env, TParam1 parameter1, TParam2 parameter2)
{
return new(
name,
recurse.Serialize(parameter1, env),
recurse.Serialize(parameter2, env));
recurse.NullAwareSerialize(parameter1, env),
recurse.NullAwareSerialize(parameter2, env));
}

private static Instruction CreateInstruction<TParam1, TParam2, TParam3>(string name, IGremlinQueryFragmentSerializer recurse, IGremlinQueryEnvironment env, TParam1 parameter1, TParam2 parameter2, TParam3 parameter3)
{
return new(
name,
recurse.Serialize(parameter1, env),
recurse.Serialize(parameter2, env),
recurse.Serialize(parameter3, env));
recurse.NullAwareSerialize(parameter1, env),
recurse.NullAwareSerialize(parameter2, env),
recurse.NullAwareSerialize(parameter3, env));
}

private static Instruction CreateInstruction<TParam>(string name, IGremlinQueryFragmentSerializer recurse, IGremlinQueryEnvironment env, ImmutableArray<TParam> parameters)
{
if (parameters.Length == 0)
return CreateInstruction(name);

var arguments = new object[parameters.Length];
var arguments = new object?[parameters.Length];

for (var i = 0; i < parameters.Length; i++)
{
arguments[i] = recurse.Serialize(parameters[i], env);
arguments[i] = recurse.NullAwareSerialize(parameters[i], env);
}

return new Instruction(name, arguments);
}

private static object? NullAwareSerialize<TParam>(this IGremlinQueryFragmentSerializer serializer, TParam maybeParameter, IGremlinQueryEnvironment env)
{
return maybeParameter is { } parameter
? serializer.Serialize(parameter, env)
: default;
}
}
}

0 comments on commit 3e16abf

Please sign in to comment.