Skip to content

Commit 1cb1fc8

Browse files
committed
Filter: add ExactMatch to add local filtering check
Orchestrator breaks OData spec and considers `eq` to be `Contains`. This fix is to add an extra check on the client that the returned dto matches the desired filter. `-ExactMatch` parameter is required to enable the local check. Fixes #109
1 parent d48ab34 commit 1cb1fc8

25 files changed

+310
-96
lines changed

Diff for: UiPath.PowerShell/Util/FilteredBaseCmdlet.cs

+34-11
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,24 @@ public class FilteredBaseCmdlet : AuthenticatedCmdlet
1616
[Parameter]
1717
public SwitchParameter Paging { get; set; }
1818

19+
[Parameter]
20+
public SwitchParameter ExactMatch { get; set; }
21+
1922
protected void ProcessImpl<TDto>(Func<string, int?, int?, IODataValues<TDto>> getCollection, Func<TDto, object> writer)
2023
{
2124
HandlePaging(getCollection, writer);
2225
}
2326

2427
protected void ProcessImpl<TDto>(Func<string, IEnumerable<TDto>> getCollection, Func<TDto, object> writer)
2528
{
26-
var response = HandleHttpOperationException(() => getCollection(BuildFilter()));
29+
var (odataFilter, localFilter) = BuildFilter<TDto>();
30+
var response = HandleHttpOperationException(() => getCollection(odataFilter));
2731
foreach (var dto in response)
2832
{
33+
if (ExactMatch.IsPresent && !localFilter(dto))
34+
{
35+
continue;
36+
}
2937
WriteObject(writer(dto));
3038
}
3139
}
@@ -36,18 +44,24 @@ protected void HandlePaging<TDto>(Func<string, int?, int?, IODataValues<TDto>> g
3644
do
3745
{
3846
last = 0;
39-
var response = HandleHttpOperationException(() => getCollection(BuildFilter(), top, skip));
47+
var (odataFilter, localFilter) = BuildFilter<TDto>();
48+
var response = HandleHttpOperationException(() => getCollection(odataFilter, top, skip));
4049
foreach (var dto in response.Value)
4150
{
42-
WriteObject(writer(dto));
4351
++last;
52+
if (ExactMatch.IsPresent && !localFilter(dto))
53+
{
54+
continue;
55+
}
56+
WriteObject(writer(dto));
4457
}
4558
skip = (skip ?? 0) + last;
4659
} while (Paging.IsPresent && last == top);
4760
}
4861

49-
protected string BuildFilter()
62+
protected (string, Func<TDto, bool>) BuildFilter<TDto>()
5063
{
64+
Func<TDto, bool> localFilter = (dto) => true;
5165
StringBuilder sb = new StringBuilder();
5266
string and = null;
5367
foreach (var p in this.GetType()
@@ -64,11 +78,7 @@ protected string BuildFilter()
6478
if (type.IsAssignableFrom(typeof(SwitchParameter)))
6579
{
6680
SwitchParameter sw = (SwitchParameter)value;
67-
if (!sw.IsPresent)
68-
{
69-
continue;
70-
}
71-
value = true;
81+
value = sw.ToBool();
7282
}
7383
type = value.GetType(); // value may had changed above
7484
string eqToken;
@@ -82,18 +92,31 @@ protected string BuildFilter()
8292
}
8393
else if (type.IsAssignableFrom(typeof(Guid)))
8494
{
85-
eqToken = $"'{value.ToString()}'";
95+
eqToken = $"'{value}'";
8696
}
8797
else
8898
{
8999
eqToken = $"'{HttpUtility.UrlEncode(value.ToString().Replace("'", "''"))}'";
90100
}
91101
sb.Append($"{and}{p.Name} eq {eqToken}");
102+
103+
var dtoProperty = typeof(TDto).GetProperty(p.Name);
104+
if (dtoProperty != null)
105+
{
106+
var oldFilter = localFilter;
107+
Func<TDto, bool> newFilter = (dto) =>
108+
{
109+
var dtoValue = dtoProperty.GetValue(dto);
110+
return string.Compare(dtoValue.ToString(), value.ToString()) == 0;
111+
};
112+
localFilter = (dto) => oldFilter(dto) && newFilter(dto);
113+
}
114+
92115
and = " and ";
93116
}
94117
}
95118
WriteVerbose($"filter: {sb}");
96-
return sb.Length > 0 ? sb.ToString() : null;
119+
return (sb.Length > 0 ? sb.ToString() : null, localFilter);
97120
}
98121
}
99122
}

Diff for: UiPath.PowerShell/Util/FilteredIdCmdlet.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,14 @@ protected void ProcessImpl<TDto>(Func<string, IList<TDto>> getCollection, Func<l
2929
}
3030
else
3131
{
32-
var dtos = HandleHttpOperationException(() => getCollection(BuildFilter()));
32+
var (odataFilter, localFilter) = BuildFilter<TDto>();
33+
var dtos = HandleHttpOperationException(() => getCollection(odataFilter));
3334
foreach(var dto in dtos)
3435
{
36+
if (ExactMatch.IsPresent && !localFilter(dto))
37+
{
38+
continue;
39+
}
3540
WriteObject(writer(dto));
3641
}
3742
}

Diff for: docs/Get-UiPathAsset.md

+10-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathAsset [-AuthToken <AuthToken>] [-Name <string>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
11-
[<CommonParameters>]
10+
Get-UiPathAsset [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Name <string>] [-Paging
11+
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1212
1313
1414
DESCRIPTION
@@ -31,6 +31,14 @@ PARAMETERS
3131
Accept pipeline input? false
3232
Accept wildcard characters? false
3333
34+
-ExactMatch <SwitchParameter>
35+
36+
Required? false
37+
Position? named
38+
Default value False
39+
Accept pipeline input? false
40+
Accept wildcard characters? false
41+
3442
-AuthToken <AuthToken>
3543
3644
Required? false

Diff for: docs/Get-UiPathCredentialStore.md

+14-6
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathCredentialStore [-AuthToken <AuthToken>] [-Name <string>] [-Paging <SwitchParameter>] [-RequestTimeout
11-
<int>] [-Type <string>] [<CommonParameters>]
10+
Get-UiPathCredentialStore [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Name <string>] [-Paging
11+
<SwitchParameter>] [-RequestTimeout <int>] [-Type <string>] [<CommonParameters>]
1212
13-
Get-UiPathCredentialStore -Default <string> [-AuthToken <AuthToken>] [-Paging <SwitchParameter>] [-RequestTimeout
14-
<int>] [<CommonParameters>]
13+
Get-UiPathCredentialStore -Default <string> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Paging
14+
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1515
16-
Get-UiPathCredentialStore -Id <long> [-AuthToken <AuthToken>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
17-
[<CommonParameters>]
16+
Get-UiPathCredentialStore -Id <long> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Paging
17+
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1818
1919
2020
DESCRIPTION
@@ -61,6 +61,14 @@ PARAMETERS
6161
Accept pipeline input? false
6262
Accept wildcard characters? false
6363
64+
-ExactMatch <SwitchParameter>
65+
66+
Required? false
67+
Position? named
68+
Default value False
69+
Accept pipeline input? false
70+
Accept wildcard characters? false
71+
6472
-AuthToken <AuthToken>
6573
6674
Required? false

Diff for: docs/Get-UiPathEnvironment.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathEnvironment [-AuthToken <AuthToken>] [-Name <string>] [-Paging <SwitchParameter>] [-RequestTimeout
11-
<int>] [-Type <string>] [<CommonParameters>]
10+
Get-UiPathEnvironment [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Name <string>] [-Paging
11+
<SwitchParameter>] [-RequestTimeout <int>] [-Type <string>] [<CommonParameters>]
1212
13-
Get-UiPathEnvironment -Id <long> [-AuthToken <AuthToken>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
14-
[<CommonParameters>]
13+
Get-UiPathEnvironment -Id <long> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Paging
14+
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1515
1616
1717
DESCRIPTION
@@ -50,6 +50,14 @@ PARAMETERS
5050
Accept pipeline input? false
5151
Accept wildcard characters? false
5252
53+
-ExactMatch <SwitchParameter>
54+
55+
Required? false
56+
Position? named
57+
Default value False
58+
Accept pipeline input? false
59+
Accept wildcard characters? false
60+
5361
-AuthToken <AuthToken>
5462
5563
Required? false

Diff for: docs/Get-UiPathFolder.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathFolder [-AuthToken <AuthToken>] [-DisplayName <string>] [-FullyQualifiedName <string>] [-Paging
11-
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
10+
Get-UiPathFolder [-AuthToken <AuthToken>] [-DisplayName <string>] [-ExactMatch <SwitchParameter>]
11+
[-FullyQualifiedName <string>] [-Paging <SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1212
13-
Get-UiPathFolder -Id <long> [-AuthToken <AuthToken>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
14-
[<CommonParameters>]
13+
Get-UiPathFolder -Id <long> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Paging <SwitchParameter>]
14+
[-RequestTimeout <int>] [<CommonParameters>]
1515
1616
1717
DESCRIPTION
@@ -50,6 +50,14 @@ PARAMETERS
5050
Accept pipeline input? false
5151
Accept wildcard characters? false
5252
53+
-ExactMatch <SwitchParameter>
54+
55+
Required? false
56+
Position? named
57+
Default value False
58+
Accept pipeline input? false
59+
Accept wildcard characters? false
60+
5361
-AuthToken <AuthToken>
5462
5563
Required? false

Diff for: docs/Get-UiPathFolderUsers.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathFolderUsers [-Folder] <Folder> [-AuthToken <AuthToken>] [-IncludeInherited <bool>] [-Paging
11-
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
10+
Get-UiPathFolderUsers [-Folder] <Folder> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>]
11+
[-IncludeInherited <bool>] [-Paging <SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1212
13-
Get-UiPathFolderUsers -Id <long> [-AuthToken <AuthToken>] [-IncludeInherited <bool>] [-Paging <SwitchParameter>]
14-
[-RequestTimeout <int>] [<CommonParameters>]
13+
Get-UiPathFolderUsers -Id <long> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-IncludeInherited
14+
<bool>] [-Paging <SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1515
1616
1717
DESCRIPTION
@@ -50,6 +50,14 @@ PARAMETERS
5050
Accept pipeline input? false
5151
Accept wildcard characters? false
5252
53+
-ExactMatch <SwitchParameter>
54+
55+
Required? false
56+
Position? named
57+
Default value False
58+
Accept pipeline input? false
59+
Accept wildcard characters? false
60+
5361
-AuthToken <AuthToken>
5462
5563
Required? false

Diff for: docs/Get-UiPathJob.md

+10-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathJob -Id <long> [-AuthToken <AuthToken>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
11-
[<CommonParameters>]
10+
Get-UiPathJob -Id <long> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Paging <SwitchParameter>]
11+
[-RequestTimeout <int>] [<CommonParameters>]
1212
1313
1414
DESCRIPTION
@@ -31,6 +31,14 @@ PARAMETERS
3131
Accept pipeline input? false
3232
Accept wildcard characters? false
3333
34+
-ExactMatch <SwitchParameter>
35+
36+
Required? false
37+
Position? named
38+
Default value False
39+
Accept pipeline input? false
40+
Accept wildcard characters? false
41+
3442
-AuthToken <AuthToken>
3543
3644
Required? false

Diff for: docs/Get-UiPathLibrary.md

+10-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathLibrary [-Authors <string>] [-AuthToken <AuthToken>] [-Id <string>] [-Paging <SwitchParameter>]
11-
[-RequestTimeout <int>] [-Title <string>] [-Version <string>] [<CommonParameters>]
10+
Get-UiPathLibrary [-Authors <string>] [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Id <string>]
11+
[-Paging <SwitchParameter>] [-RequestTimeout <int>] [-Title <string>] [-Version <string>] [<CommonParameters>]
1212
1313
1414
DESCRIPTION
@@ -55,6 +55,14 @@ PARAMETERS
5555
Accept pipeline input? false
5656
Accept wildcard characters? false
5757
58+
-ExactMatch <SwitchParameter>
59+
60+
Required? false
61+
Position? named
62+
Default value False
63+
Accept pipeline input? false
64+
Accept wildcard characters? false
65+
5866
-AuthToken <AuthToken>
5967
6068
Required? false

Diff for: docs/Get-UiPathLibraryVersion.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathLibraryVersion [-Id] <string> [-AuthToken <AuthToken>] [-IsLatestVersion <bool>] [-Paging
11-
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
10+
Get-UiPathLibraryVersion [-Id] <string> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-IsLatestVersion
11+
<bool>] [-Paging <SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1212
13-
Get-UiPathLibraryVersion [-Library] <Library> [-AuthToken <AuthToken>] [-IsLatestVersion <bool>] [-Paging
14-
<SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
13+
Get-UiPathLibraryVersion [-Library] <Library> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>]
14+
[-IsLatestVersion <bool>] [-Paging <SwitchParameter>] [-RequestTimeout <int>] [<CommonParameters>]
1515
1616
1717
DESCRIPTION
@@ -50,6 +50,14 @@ PARAMETERS
5050
Accept pipeline input? false
5151
Accept wildcard characters? false
5252
53+
-ExactMatch <SwitchParameter>
54+
55+
Required? false
56+
Position? named
57+
Default value False
58+
Accept pipeline input? false
59+
Accept wildcard characters? false
60+
5361
-AuthToken <AuthToken>
5462
5563
Required? false

Diff for: docs/Get-UiPathMachine.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ SYNOPSIS
77
88
99
SYNTAX
10-
Get-UiPathMachine [-AuthToken <AuthToken>] [-Name <string>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
11-
[-Type <string>] [<CommonParameters>]
10+
Get-UiPathMachine [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Name <string>] [-Paging
11+
<SwitchParameter>] [-RequestTimeout <int>] [-Type <string>] [<CommonParameters>]
1212
13-
Get-UiPathMachine -Id <long> [-AuthToken <AuthToken>] [-Paging <SwitchParameter>] [-RequestTimeout <int>]
14-
[<CommonParameters>]
13+
Get-UiPathMachine -Id <long> [-AuthToken <AuthToken>] [-ExactMatch <SwitchParameter>] [-Paging <SwitchParameter>]
14+
[-RequestTimeout <int>] [<CommonParameters>]
1515
1616
1717
DESCRIPTION
@@ -50,6 +50,14 @@ PARAMETERS
5050
Accept pipeline input? false
5151
Accept wildcard characters? false
5252
53+
-ExactMatch <SwitchParameter>
54+
55+
Required? false
56+
Position? named
57+
Default value False
58+
Accept pipeline input? false
59+
Accept wildcard characters? false
60+
5361
-AuthToken <AuthToken>
5462
5563
Required? false

0 commit comments

Comments
 (0)