public void RebindElasticFieldsToHitProperties()
        {
            var source  = new FakeQuery <Sample>(new FakeQueryProvider()).Select(f => ElasticFields.Score);
            var rebound = ElasticFieldsProjectionExpressionVisitor.Rebind(hitParameter, "prefix", validMapping, source.Expression);

            var flattened = FlatteningExpressionVisitor.Flatten(rebound);

            Assert.Single(flattened.OfType <MemberExpression>(), e => e.Expression == hitParameter && e.Member.Name == "_score");
        }
        public void RebindElasticFieldsToHitProperties()
        {
            var source = new FakeQuery <Sample>(new FakeQueryProvider()).Select(f => ElasticFields.Score);

            var rebound = ElasticFieldsExpressionVisitor.Rebind(typeof(Sample), validMapping, source.Expression);

            var flattened = FlatteningExpressionVisitor.Flatten(rebound.Item1);

            Assert.Single(flattened.OfType <MemberExpression>(), e => e.Expression == rebound.Item2 && e.Member.Name == "_score");
        }
        public void RebindTupleCreateMethodElasticFieldsToHitProperties()
        {
            var source = new FakeQuery <Sample>(new FakeQueryProvider()).Select(f => Tuple.Create(ElasticFields.Score));

            var rebound = ElasticFieldsExpressionVisitor.Rebind("prefix", validMapping, source.Expression);

            var flattened = FlatteningExpressionVisitor.Flatten(rebound.Item1);

            Assert.Single(flattened.OfType <MemberExpression>(), e => e.Expression == rebound.Item2 && e.Member.Name == "_score");
            Assert.Contains(rebound.Item2, flattened);
        }
        public void EvaluateReplacesExpressionsWithConstantExpressions()
        {
            Expression <Func <DateTime> > call = () => DateTime.Now.Subtract(TimeSpan.FromHours(5));
            var nodeToEvaluate = FlatteningExpressionVisitor.Flatten(call).OfType <MethodCallExpression>().Single(s => s.Method.Name == "FromHours");

            var evaluation = EvaluatingExpressionVisitor.Evaluate(call, new HashSet <Expression>(new[] { nodeToEvaluate }));

            var constantNodes = FlatteningExpressionVisitor.Flatten(evaluation).OfType <ConstantExpression>().ToArray();

            Assert.Equal(1, constantNodes.Length);
            Assert.Equal(TimeSpan.FromHours(5), constantNodes.Single().Value);
        }
        public void RebindWithNonElasticMemberIsUnchanged()
        {
            var source  = new FakeQuery <Sample>(new FakeQueryProvider()).Select(f => f.Name);
            var rebound = ElasticFieldsProjectionExpressionVisitor.Rebind(hitParameter, "prefix", validMapping, source.Expression);

            var memberExpression = FlatteningExpressionVisitor.Flatten(rebound).OfType <MemberExpression>().FirstOrDefault();

            Assert.NotNull(memberExpression);
            Assert.Equal(memberExpression.Member.Name, "Name");
            Assert.IsAssignableFrom <ParameterExpression>(memberExpression.Expression);
            Assert.Equal("f", ((ParameterExpression)memberExpression.Expression).Name);
        }
        public void RebindAnonymousProjectionEntityAndElasticFieldsToMaterializationAndHitProperty()
        {
            var source  = new FakeQuery <Sample>(new FakeQueryProvider()).Select(f => new { f, ElasticFields.Score });
            var rebound = ElasticFieldsProjectionExpressionVisitor.Rebind(hitParameter, "prefix", validMapping, source.Expression);

            var flattened = FlatteningExpressionVisitor.Flatten(rebound);

            Assert.Single(flattened.OfType <MemberExpression>(), m => m.Expression == hitParameter && m.Member.Name == "_score");
            Assert.Contains(hitParameter, flattened);

            var entityParameter = flattened.OfType <ParameterExpression>().FirstOrDefault(p => p.Name == "f" && p.Type == typeof(Sample));

            Assert.NotNull(entityParameter);
            Assert.Single(flattened.OfType <NewExpression>(), e => e.Arguments.Contains(entityParameter));
        }
        public void RebindTupleCreateMethodEntityAndElasticFieldsToMaterializationAndHitProperty()
        {
            var source = new FakeQuery <Sample>(new FakeQueryProvider()).Select(f => Tuple.Create(ElasticFields.Id, f));

            var rebound = ElasticFieldsExpressionVisitor.Rebind("prefix", validMapping, source.Expression);

            var flattened = FlatteningExpressionVisitor.Flatten(rebound.Item1);

            Assert.Single(flattened.OfType <MemberExpression>(), e => e.Expression == rebound.Item2 && e.Member.Name == "_id");
            Assert.Contains(rebound.Item2, flattened);

            var entityParameter = flattened.OfType <ParameterExpression>().FirstOrDefault(p => p.Name == "f" && p.Type == typeof(Sample));

            Assert.NotNull(entityParameter);
            Assert.Single(flattened.OfType <MethodCallExpression>(), e => e.Arguments.Contains(entityParameter));
        }