Skip to content

Commit 65b5f6c

Browse files
WIP Remove function
1 parent ff5231c commit 65b5f6c

File tree

4 files changed

+59
-6
lines changed

4 files changed

+59
-6
lines changed

src/libraries/Microsoft.PowerFx.Core/Texl/Remove.cs

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ internal class RemoveFunction : BuiltinFunction, ISuggestionAwareFunction
4343

4444
public override bool MutatesArg(int argIndex, TexlNode arg) => argIndex == 0;
4545

46+
// !!!TODO this might be a problem.
4647
public override bool RequireAllParamColumns => true;
4748

4849
public override bool ArgMatchesDatasourceType(int argNum)

src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt

+40-2
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,43 @@
22

33
// Check MutationFunctionsTestSetup handler (PowerFxEvaluationTests.cs) for documentation.
44

5-
>> Collect(t1, r2);Remove(t1, r1);t1
6-
Table({Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false})
5+
// Wrong arguments
6+
>> Remove(t1, r1,"Al");
7+
Errors: Error 14-18: If provided, last argument must be 'RemoveFlags.All'. Is there a typo?|Error 0-6: The function 'Remove' has some invalid arguments.
8+
9+
>> Remove(t1, r1,"");
10+
Errors: Error 14-16: If provided, last argument must be 'RemoveFlags.All'. Is there a typo?|Error 0-6: The function 'Remove' has some invalid arguments.
11+
12+
>> Remove(t1, r1, r1, r1, r1, r1, r1, "Al");
13+
Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 35-39: If provided, last argument must be 'RemoveFlags.All'. Is there a typo?
14+
15+
>> Remove(t1, "All");
16+
Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 11-16: Cannot use a non-record value in this context: '"All"'.
17+
18+
>> Collect(t1, r2);
19+
Collect(t1, {Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true});
20+
Collect(t1, {Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false});
21+
Remove(t1,LookUp(t1,DisplayNameField2="earth"));
22+
t1
23+
Table({Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false},{Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true},{Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false})
24+
25+
>> Collect(t1, r2);
26+
Collect(t1, {Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true});
27+
Collect(t1, {Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false});
28+
Remove(t1,Last(Filter(t1, DisplayNameField2 = "earth")));
29+
t1
30+
Table({Field1:1,Field2:"earth",Field3:DateTime(2022,1,1,0,0,0,0),Field4:true},{Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false},{Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true})
31+
32+
>> Collect(t1, r2);
33+
Collect(t1, {Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true});
34+
Collect(t1, {Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false});
35+
Remove(t1,First(Filter(t1, DisplayNameField2 = "earth")));
36+
t1
37+
Table({Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false},{Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true},{Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false})
38+
39+
>> Remove(Foo, {Field1:5}, RemoveFlags.All)
40+
Errors: Error 7-10: Name isn't valid. 'Foo' isn't recognized.
41+
42+
>> Remove(Foo, Bar)
43+
Errors: Error 7-10: Name isn't valid. 'Foo' isn't recognized.|Error 12-15: Name isn't valid. 'Bar' isn't recognized.|Error 0-6: The function 'Remove' has some invalid arguments.
44+

src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationScripts/Remove.txt

+14-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ Error(Table({Kind:ErrorKind.NotFound},{Kind:ErrorKind.NotFound}))
4242
>> 3;t1
4343
Table({a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hi",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hi",c:DateTime(2024,1,1,0,0,0,0)})
4444

45+
>> Remove(t1, If(1/0<2, {a:true,b:"hello"}))
46+
Errors: Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 11-40: Missing column. Your formula is missing a column 'c' with a type of 'DateTime'.
47+
48+
>> 4;t1
49+
Table({a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hi",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hi",c:DateTime(2024,1,1,0,0,0,0)})
50+
51+
// Remove propagates error.
52+
>> Remove(t1, If(1/0<2, {a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)}))
53+
Error({Kind:ErrorKind.Div0})
54+
4555
>> Set(t3, Table({a:{aa:{aaa:true,bbb:true}}}))
4656
Table({a:{aa:{aaa:true,bbb:true}}})
4757

@@ -51,9 +61,11 @@ Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 11-30
5161
>> Remove(t3, {a:{aa:{aaa:true,bbb:false}}})
5262
Error({Kind:ErrorKind.NotFound})
5363

64+
>> Remove(t3, {a:{aa:{aaa:true,bbb:false}}}, RemoveFlags.All)
65+
Error({Kind:ErrorKind.NotFound})
66+
5467
>> Remove(t3, {a:{aa:{aaa:true,bbb:true}}})
5568
If(true, {test:1}, "Void value (result of the expression can't be used).")
5669

5770
>> t3
58-
Table()
59-
71+
Table()

src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/PADIntegrationTests.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Collections.Generic;
55
using System.Data;
6+
using System.Linq;
67
using Microsoft.PowerFx.Interpreter.Tests;
78
using Microsoft.PowerFx.Types;
89
using Xunit;
@@ -164,8 +165,9 @@ public void DataTableEvalTest2()
164165
var result7 = engine.Eval("Patch(robintable, First(robintable),{Names:\"new-name\"});robintable", options: opt);
165166
Assert.Equal("Table({Names:\"new-name\",Scores:10},{Names:\"name3\",Scores:30},{Names:\"name100\",Scores:10})", ((DataTableValue)result7).Dump());
166167

167-
var result8 = engine.Eval("Remove(robintable, {Scores:10}, RemoveFlags.All);robintable", options: opt);
168-
Assert.IsType<ErrorValue>(result8);
168+
var check = engine.Check("Remove(robintable, {Scores:10}, RemoveFlags.All)", options: opt);
169+
Assert.False(check.IsSuccess);
170+
Assert.Contains("ErrColumnMissing_ColName_ExpectedType", check.Errors.Select(err => err.MessageKey));
169171

170172
Assert.Equal(3, table.Rows.Count);
171173
}

0 commit comments

Comments
 (0)