public void OrOperatorGeneratesFlattenedOrCriteria()
        {
            var possibleIds = new[] { 1, 2, 3, 4 };
            var where = Robots.Where(e => e.Name == "IG-88" || e.Cost > 1 || e.Zone.HasValue || possibleIds.Contains(e.Id));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            Assert.IsType<OrCriteria>(criteria);
            var orCriteria = (OrCriteria)criteria;
            Assert.Equal("or", orCriteria.Name);
            Assert.Single(orCriteria.Criteria, f => f.Name == "term");
            Assert.Single(orCriteria.Criteria, f => f.Name == "range");
            Assert.Single(orCriteria.Criteria, f => f.Name == "exists");
            Assert.Single(orCriteria.Criteria, f => f.Name == "terms");
            Assert.Equal(4, orCriteria.Criteria.Count);
        }
        public static void ContainsAll_ListFirst_CreatesTermsQuery()
        {
            var matchNames = new[] { "Robbie", "Kryten", "IG-88", "Marvin" };
            var where = Robots.Where(r => ElasticMethods.ContainsAll(matchNames, r.Aliases));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            var termsCriteria = Assert.IsType<TermsCriteria>(criteria);
            Assert.Equal("prefix.aliases", termsCriteria.Field);
            Assert.Contains("Robbie", termsCriteria.Values);
            Assert.Contains("Kryten", termsCriteria.Values);
            Assert.Contains("IG-88", termsCriteria.Values);
            Assert.Contains("Marvin", termsCriteria.Values);
            Assert.Equal(TermsExecutionMode.and, termsCriteria.ExecutionMode);
        }
        public void Int32ArrayContainsGeneratesTermsCriteria()
        {
            var expectedIds = new[] { 1, 3, 2, 9, 7, 6, 123, 45678 };
            var where = Robots.Where(e => expectedIds.Contains(e.Id));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            var termsCriteria = Assert.IsType<TermsCriteria>(criteria);
            Assert.Equal("prefix.id", termsCriteria.Field);
            Assert.Equal(expectedIds.Length, termsCriteria.Values.Count);
            foreach (var term in expectedIds)
                Assert.Contains(term, termsCriteria.Values);
        }
        public void DateTimeArrayContainsGeneratesTermsCriteria()
        {
            var expectedIds = new[] { 1, 3, 2, 9, 7, 6, 123, 4568 }.Select(d => DateTime.Now.AddDays(d)).ToArray();
            var where = Robots.Where(e => expectedIds.Contains(e.Started));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            var termsCriteria = Assert.IsType<TermsCriteria>(criteria);
            Assert.Equal("terms", termsCriteria.Name);
            Assert.Equal("prefix.started", termsCriteria.Field);
            Assert.Equal(expectedIds.Length, termsCriteria.Values.Count);
            foreach (var term in expectedIds)
                Assert.Contains(term, termsCriteria.Values);
        }
        public void DoubleArrayContainsGeneratesTermsCriteria()
        {
            var expectedValues = new[] { 1.1, 3.2, 4.9, 7.6, 8.9, 12345.678 };
            var where = Robots.Where(e => expectedValues.Contains(e.EnergyUse));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            var termsCriteria = Assert.IsType<TermsCriteria>(criteria);
            Assert.Equal("prefix.energyUse", termsCriteria.Field);
            Assert.Equal(expectedValues.Length, termsCriteria.Values.Count);
            foreach (var term in expectedValues)
                Assert.Contains(term, termsCriteria.Values);
        }
        public void DecimalArrayContainsGeneratesTermsCriteria()
        {
            var expectedHourlyWages = new[] { 1.1m, 3.2m, 4.9m, 7.6m, 8.9m, 12345.678m };
            var where = Robots.Where(e => expectedHourlyWages.Contains(e.Cost));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            var termsCriteria = Assert.IsType<TermsCriteria>(criteria);
            Assert.Equal("prefix.cost", termsCriteria.Field);
            Assert.Equal(expectedHourlyWages.Length, termsCriteria.Values.Count);
            foreach (var term in expectedHourlyWages)
                Assert.Contains(term, termsCriteria.Values);
        }
        public void StringArrayInlineContainsGeneratesTermsCriteria()
        {
            var expectedNames = new[] { "Robbie", "Kryten", "IG-88", "Marvin" };
            var where = Robots.Where(e => new[] { "Robbie", "Kryten", "IG-88", "Marvin" }.Contains(e.Name));
            var criteria = ElasticQueryTranslator.Translate(Mapping, "prefix", where.Expression).SearchRequest.Filter;

            var termsCriteria = Assert.IsType<TermsCriteria>(criteria);
            Assert.Equal("prefix.name", termsCriteria.Field);
            Assert.Equal(expectedNames.Length, termsCriteria.Values.Count);
            foreach (var term in expectedNames)
                Assert.Contains(term, termsCriteria.Values);
        }
        public void QueryStringWithFieldsGeneratesQueryStringCriteriaWithFields()
        {
            const string expectedQueryStringValue = "Data";
            var expectedFields = new[] { "Green", "Brown" };
            var where = Robots.QueryString(expectedQueryStringValue, expectedFields);
            var criteria = ElasticQueryTranslator.Translate(Mapping, where.Expression).SearchRequest;

            Assert.Null(criteria.Filter);
            Assert.NotNull(criteria.Query);
            var queryStringCriteria = Assert.IsType<QueryStringCriteria>(criteria.Query);
            Assert.Equal(expectedQueryStringValue, queryStringCriteria.Value);
            Assert.Equal(expectedFields, queryStringCriteria.Fields);
        }
        public void SelectProjectionCreatesMultipleFacets()
        {
            var expectedFields = new[] { "cost", "energyUse", "started" };
            var query = Robots.GroupBy(r => 2m)
                .Select(g => new
                {
                    SumCost = g.Sum(a => a.Cost),
                    AverageEnergyUse = g.Average(a => a.EnergyUse),
                    MinStarted = g.Min(a => a.Started)
                });

            var translation = ElasticQueryTranslator.Translate(Mapping, query.Expression);

            Assert.Contains("AnonymousType", Assert.IsType<ListTermlessFacetsElasticMaterializer>(translation.Materializer).ElementType.FullName);
            Assert.Equal("count", translation.SearchRequest.SearchType);
            Assert.Equal(expectedFields.Length, translation.SearchRequest.Facets.Count);
            foreach (var expectedField in expectedFields)
            {
                var facet = translation.SearchRequest.Facets.OfType<StatisticalFacet>().Single(s => s.Fields.Contains(expectedField));
                Assert.Null(facet.Filter);
                Assert.Equal(1, facet.Fields.Count);
            }
        }