Aetheria/Assets/Scripts/ServerShared/NIH/RethinkDb.Driver.Linq/MemberNameResolver.cs
hyperion51 e96146b7bb Out with MagicOnion, in with LiteNetLib
Removed MagicOnion
Added LiteNetLib
Created client and server abstractions
Fixed serialization bugs
2020-03-24 14:36:22 +00:00

49 lines
No EOL
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Remotion.Linq.Clauses.Expressions;
using RethinkDb.Driver.Ast;
using RethinkDb.Driver.Linq.WhereClauseParsers.SubQueryVisitor;
using RethinkDb.Driver.Utils;
namespace RethinkDb.Driver.Linq
{
public class MemberNameResolver
{
private readonly MemberExpression _expression;
public MemberNameResolver( MemberExpression expression )
{
_expression = expression;
}
public ReqlExpr Resolve( ReqlExpr reqlExpr ) => ResolveMemberExpression( reqlExpr, _expression );
private static ReqlExpr ResolveMemberExpression( ReqlExpr reqlExpr, MemberExpression expression )
{
if( expression.Expression.NodeType == ExpressionType.MemberAccess )
reqlExpr = ResolveMemberExpression( reqlExpr, (MemberExpression)expression.Expression );
if( expression.Expression.NodeType == ExpressionType.Extension && expression.Expression is SubQueryExpression )
reqlExpr = ResolveExtensionExpression( reqlExpr, (SubQueryExpression)expression.Expression );
return reqlExpr[QueryHelper.GetJsonMemberName( expression.Member )];
}
private static ReqlExpr ResolveExtensionExpression( ReqlExpr reqlExpr, SubQueryExpression expression )
{
var subQueryVisitors = new List<ISubQueryVisitor>
{
new AnySubQueryVisitor(),
new AllSubQueryVisitor(),
new FirstAndLastSubQueryVisitor()
};
var subQueryVisitor = subQueryVisitors.FirstOrDefault( x => x.CanVisit( expression.QueryModel ) );
if( subQueryVisitor == null )
throw new NotSupportedException( "subqueries not allowed ." );
return subQueryVisitor.Visit( reqlExpr, expression.QueryModel );
}
}
}