-
-
Notifications
You must be signed in to change notification settings - Fork 24
Elasticsearch DateMath support #113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 3 commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
904ea19
Adds wildcard support to date range parsing
niemyjski f952c8d
Extends date range parser to support new formats
niemyjski d4ad41f
Updates .gitignore to exclude IDE files
niemyjski 993eb8b
Merge branch 'main' into feature/datemath
niemyjski 46a32f7
Improves regex parsing performance
niemyjski 1b7ef73
Adds two-part format parser tests
niemyjski b5ebbfe
Adds Elasticsearch date math expression support
niemyjski 6c4049d
pr feedbacj
niemyjski db06e16
Improves date math expression parsing.
niemyjski 5eddd17
Introduces DateMath utility for date math parsing
niemyjski 9298e48
Refactors date parsing and validates date math.
niemyjski a3c045e
Adds bracket matching validation to parser
niemyjski 66bee81
Adds timezone support to DateMath
niemyjski b74c5ea
Renames DateMath tests for timezone parsing
niemyjski File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
...tionless.DateTimeExtensions/FormatParsers/FormatParsers/PartParsers/WildcardPartParser.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
using System; | ||
using System.Text.RegularExpressions; | ||
|
||
namespace Exceptionless.DateTimeExtensions.FormatParsers.PartParsers; | ||
|
||
[Priority(1)] | ||
public class WildcardPartParser : IPartParser | ||
{ | ||
private static readonly Regex _wildCardRegex = new(@"\G\s*\*(?=\s|\]|\}|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase); | ||
|
||
public Regex Regex => _wildCardRegex; | ||
|
||
public DateTimeOffset? Parse(Match match, DateTimeOffset relativeBaseTime, bool isUpperLimit) | ||
{ | ||
if (!match.Success) | ||
return null; | ||
|
||
return isUpperLimit ? DateTimeOffset.MaxValue : DateTimeOffset.MinValue; | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
117 changes: 117 additions & 0 deletions
117
...ceptionless.DateTimeExtensions.Tests/FormatParsers/PartParsers/WildcardPartParserTests.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Text.RegularExpressions; | ||
using Exceptionless.DateTimeExtensions.FormatParsers.PartParsers; | ||
using Microsoft.Extensions.Logging; | ||
using Xunit; | ||
using Xunit.Abstractions; | ||
|
||
namespace Exceptionless.DateTimeExtensions.Tests.FormatParsers.PartParsers; | ||
|
||
public class WildcardPartParserTests : PartParserTestsBase | ||
{ | ||
public WildcardPartParserTests(ITestOutputHelper output) : base(output) { } | ||
|
||
[Theory] | ||
[MemberData(nameof(ParseInputs))] | ||
public void ParseInput(string input, bool isUpperLimit, DateTimeOffset? expected) | ||
{ | ||
var parser = new WildcardPartParser(); | ||
_logger.LogInformation("Testing input: '{Input}', IsUpperLimit: {IsUpperLimit}, Expected: {Expected}", input, isUpperLimit, expected); | ||
|
||
var match = parser.Regex.Match(input); | ||
_logger.LogInformation("Regex match success: {Success}, Value: '{Value}', Index: {Index}, Length: {Length}", match.Success, match.Value, match.Index, match.Length); | ||
|
||
var result = parser.Parse(match, _now, isUpperLimit); | ||
_logger.LogInformation("Parse result: {Result}", result); | ||
|
||
if (expected == null) | ||
{ | ||
Assert.Null(result); | ||
} | ||
else | ||
{ | ||
Assert.NotNull(result); | ||
Assert.Equal(expected.Value.DateTime, result.Value.DateTime); | ||
} | ||
} | ||
|
||
public static IEnumerable<object[]> ParseInputs | ||
{ | ||
get | ||
{ | ||
return new[] | ||
{ | ||
// Valid wildcard inputs | ||
new object[] { "*", false, DateTimeOffset.MinValue }, | ||
new object[] { "*", true, DateTimeOffset.MaxValue }, | ||
new object[] { " * ", false, DateTimeOffset.MinValue }, | ||
new object[] { " * ", true, DateTimeOffset.MaxValue }, | ||
new object[] { " * ", false, DateTimeOffset.MinValue }, | ||
new object[] { " * ", true, DateTimeOffset.MaxValue }, | ||
|
||
// Invalid inputs (patterns that should not match a complete wildcard) | ||
new object[] { "blah", false, null }, | ||
new object[] { "blah", true, null }, | ||
new object[] { "2012", false, null }, | ||
new object[] { "2012", true, null }, | ||
new object[] { "**", false, null }, | ||
|
||
// This should match the first * in a two-part context like "* *" | ||
new object[] { "* *", false, DateTimeOffset.MinValue }, | ||
}; | ||
} | ||
} | ||
|
||
[Fact] | ||
public void RegexPatternTest() | ||
{ | ||
var parser = new WildcardPartParser(); | ||
var regex = parser.Regex; | ||
|
||
_logger.LogInformation("Regex pattern: {Pattern}", regex); | ||
|
||
// Test various inputs | ||
var testInputs = new[] { "*", " * ", " * ", "blah", "2012", "**", "* *", "" }; | ||
|
||
foreach (var input in testInputs) | ||
{ | ||
var match = regex.Match(input); | ||
_logger.LogInformation("Input: '{Input}' -> Success: {Success}, Value: '{Value}', Index: {Index}, Length: {Length}", input, match.Success, match.Value, match.Index, match.Length); | ||
} | ||
} | ||
|
||
[Fact] | ||
public void TestInTwoPartContext() | ||
{ | ||
var parser = new WildcardPartParser(); | ||
|
||
// Test how it behaves in a two-part parsing context | ||
var inputs = new[] { "* TO 2013", "2012 TO *", "[* TO 2013]", "{2012 TO *}" }; | ||
|
||
foreach (var input in inputs) | ||
{ | ||
_logger.LogInformation("Testing two-part context for: '{Input}'", input); | ||
|
||
// Test parsing at the beginning | ||
var match = parser.Regex.Match(input, 0); | ||
_logger.LogInformation(" At position 0: Success: {Success}, Value: '{Value}', Index: {Index}, Length: {Length}", match.Success, match.Value, match.Index, match.Length); | ||
|
||
// Test parsing after bracket | ||
if (input.StartsWith("[") || input.StartsWith("{")) | ||
{ | ||
match = parser.Regex.Match(input, 1); | ||
_logger.LogInformation(" At position 1: Success: {Success}, Value: '{Value}', Index: {Index}, Length: {Length}", match.Success, match.Value, match.Index, match.Length); | ||
} | ||
|
||
// Find TO and test parsing after it | ||
var toIndex = input.IndexOf(" TO ", StringComparison.OrdinalIgnoreCase); | ||
if (toIndex >= 0) | ||
{ | ||
var afterTo = toIndex + 4; | ||
match = parser.Regex.Match(input, afterTo); | ||
_logger.LogInformation(" After TO at position {Position}: Success: {Success}, Value: '{Value}', Index: {Index}, Length: {Length}", afterTo, match.Success, match.Value, match.Index, match.Length); | ||
} | ||
} | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.