From 96e64ea07d25ed08af05d3b5e3c342d752aa3416 Mon Sep 17 00:00:00 2001 From: Ales Pour Date: Thu, 20 Jul 2023 18:10:58 +0200 Subject: [PATCH 1/7] test: add nested or test (issue #481) --- Client.Linq.Test/ItInfluxDBQueryableTest.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Client.Linq.Test/ItInfluxDBQueryableTest.cs b/Client.Linq.Test/ItInfluxDBQueryableTest.cs index 581b8f629..2c4aa5f60 100644 --- a/Client.Linq.Test/ItInfluxDBQueryableTest.cs +++ b/Client.Linq.Test/ItInfluxDBQueryableTest.cs @@ -71,6 +71,24 @@ orderby s.Timestamp Assert.AreEqual(1, sensors.Count); } + [Test] + public void QueryExampleNestedOr() + { + // https://github.com/influxdata/influxdb-client-csharp/issues/481 + var query = (from s in InfluxDBQueryable.Queryable("my-bucket", "my-org", _client.GetQueryApiSync()) + where (((((s.SensorId == "id-1") || (s.SensorId == "id-no-5")) || (s.SensorId == "id-no-8")) || (s.SensorId == "id-no-10")) || (s.SensorId == "id-no-12")) + where s.Value > 12 + where s.Timestamp > new DateTime(2019, 11, 16, 8, 20, 15, DateTimeKind.Utc) + where s.Timestamp < new DateTime(2021, 01, 10, 5, 10, 0, DateTimeKind.Utc) + select s) + .Take(2) + .Skip(2); + + var sensors = query.ToList(); + + Assert.AreEqual(1, sensors.Count); + } + [Test] public void QueryExampleCount() { From ea79e89dd25de4fac91f66da196a343f27e5131f Mon Sep 17 00:00:00 2001 From: Ales Pour Date: Thu, 20 Jul 2023 20:48:13 +0200 Subject: [PATCH 2/7] fix: prevent empty filters --- Client.Linq/Internal/QueryAggregator.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Client.Linq/Internal/QueryAggregator.cs b/Client.Linq/Internal/QueryAggregator.cs index fb5286c68..5066559dd 100644 --- a/Client.Linq/Internal/QueryAggregator.cs +++ b/Client.Linq/Internal/QueryAggregator.cs @@ -129,12 +129,18 @@ internal void AddLimitTailOffset(string limitOffsetAssignment) internal void AddFilterByTags(string filter) { - _filterByTags.Add(filter); + if (!string.IsNullOrEmpty(filter)) + { + _filterByTags.Add(filter); + } } internal void AddFilterByFields(string filter) { - _filterByFields.Add(filter); + if (!string.IsNullOrEmpty(filter)) + { + _filterByFields.Add(filter); + } } internal void AddSubQueries(QueryAggregator aggregator) From 683609504cd18605ff86290b978611d7448d9474 Mon Sep 17 00:00:00 2001 From: Ales Pour Date: Thu, 20 Jul 2023 20:49:11 +0200 Subject: [PATCH 3/7] fix: expression normalization --- .../Internal/QueryExpressionTreeVisitor.cs | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/Client.Linq/Internal/QueryExpressionTreeVisitor.cs b/Client.Linq/Internal/QueryExpressionTreeVisitor.cs index f3a4a65ca..20a1b39aa 100644 --- a/Client.Linq/Internal/QueryExpressionTreeVisitor.cs +++ b/Client.Linq/Internal/QueryExpressionTreeVisitor.cs @@ -331,62 +331,76 @@ internal static void NormalizeExpressions(List parts) var indexes = Enumerable.Range(0, parts.Count) .Where(i => parts[i] is BinaryOperator) .ToList(); + var eliminators = new List>(); foreach (var index in indexes) { // "( and )" if (index >= 1 && parts[index - 1] is LeftParenthesis && parts[index + 1] is RightParenthesis) { - parts.RemoveAt(index + 1); - parts.RemoveAt(index); - parts.RemoveAt(index - 1); - - NormalizeExpressions(parts); - return; + eliminators.Add(Tuple.Create(1, () => + { + parts.RemoveAt(index + 1); + parts.RemoveAt(index); + parts.RemoveAt(index - 1); + })); + continue; } // "( timestamp > )" if (index >= 2 && parts[index - 2] is LeftParenthesis && parts[index + 1] is RightParenthesis) { - parts.RemoveAt(index + 1); - parts.RemoveAt(index); - parts.RemoveAt(index - 1); - parts.RemoveAt(index - 2); - - NormalizeExpressions(parts); - return; + eliminators.Add(Tuple.Create(1, () => + { + parts.RemoveAt(index + 1); + parts.RemoveAt(index); + parts.RemoveAt(index - 1); + parts.RemoveAt(index - 2); + })); + continue; } // "( < timestamp )" if (index >= 1 && parts[index - 1] is LeftParenthesis && parts[index + 2] is RightParenthesis) { - parts.RemoveAt(index + 2); - parts.RemoveAt(index + 1); - parts.RemoveAt(index); - parts.RemoveAt(index - 1); - - NormalizeExpressions(parts); - return; + eliminators.Add(Tuple.Create(10, () => + { + parts.RemoveAt(index + 2); + parts.RemoveAt(index + 1); + parts.RemoveAt(index); + parts.RemoveAt(index - 1); + })); + continue; } // "( or (r["sensor_id"] != p4))" if (index >= 1 && parts[index - 1] is LeftParenthesis && parts[index + 1] is LeftParenthesis) { - parts.RemoveAt(index); - - NormalizeExpressions(parts); - return; + eliminators.Add(Tuple.Create(1, () => + { + parts.RemoveAt(index); + })); + continue; } // "(r["sensor_id"] != p4) or )" if (index >= 1 && parts[index - 1] is RightParenthesis && parts[index + 1] is RightParenthesis) { - parts.RemoveAt(index); - - NormalizeExpressions(parts); - return; + eliminators.Add(Tuple.Create(1, () => + { + parts.RemoveAt(index); + })); + continue; } } + + if (eliminators.Count > 0) + { + eliminators.Sort((e1, e2) => e2.Item1.CompareTo(e1.Item1)); // descending order + eliminators[0].Item2(); + NormalizeExpressions(parts); + return; + } } // Parenthesis From 6081819585a79e1c12e5beb28e77875ef7015e8b Mon Sep 17 00:00:00 2001 From: Ales Pour Date: Thu, 20 Jul 2023 20:49:29 +0200 Subject: [PATCH 4/7] docs: update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8943d2007..8ebd5468c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Features 1. [#528](https://github.com/influxdata/influxdb-client-csharp/pull/528): Add HttpClient as a part of InfluxDBClientOptions +1. [#555](https://github.com/influxdata/influxdb-client-csharp/pull/555): Chaining multiple conditions in LINQ queries ### Dependencies Update dependencies: From aa79c0c5001daef1d7ab2823b5ac178a7f6a22de Mon Sep 17 00:00:00 2001 From: Ales Pour Date: Thu, 20 Jul 2023 21:07:55 +0200 Subject: [PATCH 5/7] style: code formatting --- Client.Linq.Test/ItInfluxDBQueryableTest.cs | 2 ++ Client.Linq/Internal/QueryExpressionTreeVisitor.cs | 10 ++-------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Client.Linq.Test/ItInfluxDBQueryableTest.cs b/Client.Linq.Test/ItInfluxDBQueryableTest.cs index 2c4aa5f60..113987ce2 100644 --- a/Client.Linq.Test/ItInfluxDBQueryableTest.cs +++ b/Client.Linq.Test/ItInfluxDBQueryableTest.cs @@ -76,7 +76,9 @@ public void QueryExampleNestedOr() { // https://github.com/influxdata/influxdb-client-csharp/issues/481 var query = (from s in InfluxDBQueryable.Queryable("my-bucket", "my-org", _client.GetQueryApiSync()) +// ReSharper disable All where (((((s.SensorId == "id-1") || (s.SensorId == "id-no-5")) || (s.SensorId == "id-no-8")) || (s.SensorId == "id-no-10")) || (s.SensorId == "id-no-12")) +// ReSharper restore All where s.Value > 12 where s.Timestamp > new DateTime(2019, 11, 16, 8, 20, 15, DateTimeKind.Utc) where s.Timestamp < new DateTime(2021, 01, 10, 5, 10, 0, DateTimeKind.Utc) diff --git a/Client.Linq/Internal/QueryExpressionTreeVisitor.cs b/Client.Linq/Internal/QueryExpressionTreeVisitor.cs index 20a1b39aa..618287e02 100644 --- a/Client.Linq/Internal/QueryExpressionTreeVisitor.cs +++ b/Client.Linq/Internal/QueryExpressionTreeVisitor.cs @@ -376,20 +376,14 @@ internal static void NormalizeExpressions(List parts) // "( or (r["sensor_id"] != p4))" if (index >= 1 && parts[index - 1] is LeftParenthesis && parts[index + 1] is LeftParenthesis) { - eliminators.Add(Tuple.Create(1, () => - { - parts.RemoveAt(index); - })); + eliminators.Add(Tuple.Create(1, () => { parts.RemoveAt(index); })); continue; } // "(r["sensor_id"] != p4) or )" if (index >= 1 && parts[index - 1] is RightParenthesis && parts[index + 1] is RightParenthesis) { - eliminators.Add(Tuple.Create(1, () => - { - parts.RemoveAt(index); - })); + eliminators.Add(Tuple.Create(1, () => { parts.RemoveAt(index); })); continue; } } From 70950284d2228e3c47b66507f9b5075b526a0a9e Mon Sep 17 00:00:00 2001 From: Ales Pour Date: Thu, 20 Jul 2023 21:16:56 +0200 Subject: [PATCH 6/7] style: code formatting again --- Client.Linq.Test/ItInfluxDBQueryableTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Client.Linq.Test/ItInfluxDBQueryableTest.cs b/Client.Linq.Test/ItInfluxDBQueryableTest.cs index 113987ce2..6129b1426 100644 --- a/Client.Linq.Test/ItInfluxDBQueryableTest.cs +++ b/Client.Linq.Test/ItInfluxDBQueryableTest.cs @@ -77,7 +77,8 @@ public void QueryExampleNestedOr() // https://github.com/influxdata/influxdb-client-csharp/issues/481 var query = (from s in InfluxDBQueryable.Queryable("my-bucket", "my-org", _client.GetQueryApiSync()) // ReSharper disable All - where (((((s.SensorId == "id-1") || (s.SensorId == "id-no-5")) || (s.SensorId == "id-no-8")) || (s.SensorId == "id-no-10")) || (s.SensorId == "id-no-12")) + where (((((s.SensorId == "id-1") || (s.SensorId == "id-no-5")) || (s.SensorId == "id-no-8")) || + (s.SensorId == "id-no-10")) || (s.SensorId == "id-no-12")) // ReSharper restore All where s.Value > 12 where s.Timestamp > new DateTime(2019, 11, 16, 8, 20, 15, DateTimeKind.Utc) From 177c27aea39480630ca6730794b7671057319fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Bedn=C3=A1=C5=99?= Date: Fri, 21 Jul 2023 06:30:04 +0200 Subject: [PATCH 7/7] docs: update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ebd5468c..43100cc21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### Features 1. [#528](https://github.com/influxdata/influxdb-client-csharp/pull/528): Add HttpClient as a part of InfluxDBClientOptions + +### Bug Fixes 1. [#555](https://github.com/influxdata/influxdb-client-csharp/pull/555): Chaining multiple conditions in LINQ queries ### Dependencies pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy