gooddata 0.6.11 → 0.6.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +6 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +34 -1
- data/CLI.md +1 -1
- data/authors.sh +4 -0
- data/lib/gooddata.rb +1 -1
- data/lib/gooddata/cli/commands/api_cmd.rb +0 -2
- data/lib/gooddata/cli/commands/auth_cmd.rb +0 -3
- data/lib/gooddata/cli/commands/console_cmd.rb +1 -2
- data/lib/gooddata/cli/commands/domain_cmd.rb +0 -2
- data/lib/gooddata/cli/commands/process_cmd.rb +0 -2
- data/lib/gooddata/cli/commands/project_cmd.rb +0 -2
- data/lib/gooddata/cli/commands/projects_cmd.rb +0 -2
- data/lib/gooddata/cli/commands/run_ruby_cmd.rb +2 -3
- data/lib/gooddata/cli/commands/scaffold_cmd.rb +0 -3
- data/lib/gooddata/cli/commands/user_cmd.rb +0 -2
- data/lib/gooddata/cli/shared.rb +1 -2
- data/lib/gooddata/commands/datawarehouse.rb +24 -0
- data/lib/gooddata/commands/process.rb +0 -1
- data/lib/gooddata/commands/project.rb +1 -1
- data/lib/gooddata/commands/scaffold.rb +0 -1
- data/lib/gooddata/core/connection.rb +376 -0
- data/lib/gooddata/core/logging.rb +13 -0
- data/lib/gooddata/core/rest.rb +40 -16
- data/lib/gooddata/exceptions/user_in_different_domain.rb +11 -0
- data/lib/gooddata/extensions/enumerable.rb +8 -0
- data/lib/gooddata/goodzilla/goodzilla.rb +24 -0
- data/lib/gooddata/helpers/global_helpers.rb +126 -12
- data/lib/gooddata/mixins/author.rb +11 -5
- data/lib/gooddata/mixins/is_dimension.rb +13 -0
- data/lib/gooddata/mixins/md_object_indexer.rb +17 -1
- data/lib/gooddata/mixins/md_object_query.rb +10 -2
- data/lib/gooddata/mixins/md_relations.rb +2 -2
- data/lib/gooddata/mixins/rest_resource.rb +1 -0
- data/lib/gooddata/models/data_result.rb +0 -1
- data/lib/gooddata/models/datawarehouse.rb +90 -0
- data/lib/gooddata/models/domain.rb +202 -76
- data/lib/gooddata/models/execution.rb +11 -0
- data/lib/gooddata/models/from_wire.rb +4 -4
- data/lib/gooddata/models/invitation.rb +0 -5
- data/lib/gooddata/models/membership.rb +121 -91
- data/lib/gooddata/models/metadata.rb +1 -2
- data/lib/gooddata/models/metadata/attribute.rb +7 -0
- data/lib/gooddata/models/metadata/dashboard.rb +1 -1
- data/lib/gooddata/models/metadata/dimension.rb +52 -0
- data/lib/gooddata/models/metadata/fact.rb +1 -1
- data/lib/gooddata/models/metadata/label.rb +21 -7
- data/lib/gooddata/models/metadata/metric.rb +1 -23
- data/lib/gooddata/models/metadata/report.rb +2 -2
- data/lib/gooddata/models/metadata/report_definition.rb +22 -2
- data/lib/gooddata/models/metadata/variable.rb +81 -0
- data/lib/gooddata/models/model.rb +2 -1
- data/lib/gooddata/models/process.rb +3 -4
- data/lib/gooddata/models/profile.rb +50 -82
- data/lib/gooddata/models/project.rb +170 -213
- data/lib/gooddata/models/project_blueprint.rb +14 -5
- data/lib/gooddata/models/project_creator.rb +2 -2
- data/lib/gooddata/models/schedule.rb +10 -8
- data/lib/gooddata/models/to_wire.rb +2 -2
- data/lib/gooddata/models/user_filters/mandatory_user_filter.rb +67 -0
- data/lib/gooddata/models/user_filters/user_filter.rb +96 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +409 -0
- data/lib/gooddata/{rest/connections/connections.rb → models/user_filters/user_filters.rb} +1 -0
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +14 -0
- data/lib/gooddata/rest/client.rb +32 -21
- data/lib/gooddata/rest/connection.rb +283 -11
- data/lib/gooddata/rest/connections/rest_client_connection.rb +47 -109
- data/lib/gooddata/version.rb +1 -1
- data/spec/data/column_based_permissions.csv +7 -0
- data/spec/data/column_based_permissions2.csv +6 -0
- data/spec/data/hello_world_process/hello_world.rb +3 -1
- data/spec/data/line_based_permissions.csv +3 -0
- data/spec/data/m_n_model/blueprint.json +76 -0
- data/spec/data/{model_view.json → wire_models/model_view.json} +0 -0
- data/spec/data/wire_models/nu_model.json +3046 -0
- data/spec/helpers/process_helper.rb +2 -2
- data/spec/helpers/project_helper.rb +29 -0
- data/spec/helpers/schedule_helper.rb +1 -1
- data/spec/integration/command_datawarehouse_spec.rb +32 -0
- data/spec/integration/create_project_spec.rb +0 -1
- data/spec/integration/full_process_schedule_spec.rb +13 -5
- data/spec/integration/full_project_spec.rb +2 -1
- data/spec/integration/over_to_user_filters_spec.rb +92 -0
- data/spec/integration/project_spec.rb +233 -0
- data/spec/integration/rest_spec.rb +209 -0
- data/spec/integration/user_filters_spec.rb +193 -0
- data/spec/integration/variables_spec.rb +196 -0
- data/spec/unit/commands/command_auth_spec.rb +0 -7
- data/spec/unit/commands/command_process_spec.rb +10 -13
- data/spec/unit/core/connection_spec.rb +0 -19
- data/spec/unit/helpers/global_helpers_spec.rb +57 -0
- data/spec/unit/models/domain_spec.rb +80 -40
- data/spec/unit/models/from_wire_spec.rb +8 -1
- data/spec/unit/models/params_spec.rb +6 -6
- data/spec/unit/models/profile_spec.rb +23 -22
- data/spec/unit/models/project_blueprint_spec.rb +1 -6
- data/spec/unit/models/project_spec.rb +331 -286
- data/spec/unit/models/schedule_spec.rb +39 -14
- data/spec/unit/models/user_filters_spec.rb +89 -0
- data/spec/unit/models/variable_spec.rb +259 -0
- metadata +31 -7
- data/lib/gooddata/rest/connections/dummy_connection.rb +0 -52
- data/spec/unit/core/rest_spec.rb +0 -106
@@ -17,18 +17,16 @@ describe GoodData::Schedule do
|
|
17
17
|
|
18
18
|
before(:each) do
|
19
19
|
@client = ConnectionHelper.create_default_connection
|
20
|
-
|
20
|
+
|
21
21
|
@project = ProjectHelper.get_default_project(:client => @client)
|
22
|
-
|
23
|
-
@project_executable = './graph/graph.grf'
|
24
|
-
|
22
|
+
@project_executable = 'graph/graph.grf'
|
25
23
|
@test_data = {
|
26
24
|
:timezone => 'UTC',
|
27
25
|
:cron => '2 2 2 2 *',
|
28
26
|
:client => @client,
|
29
27
|
:project => @project
|
30
28
|
}
|
31
|
-
|
29
|
+
|
32
30
|
@test_data_with_optional_param = {
|
33
31
|
:timezone => 'UTC',
|
34
32
|
:cron => '2 2 2 2 *',
|
@@ -92,7 +90,7 @@ describe GoodData::Schedule do
|
|
92
90
|
expect {
|
93
91
|
sched = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
94
92
|
}.not_to raise_error
|
95
|
-
|
93
|
+
|
96
94
|
sched.should_not be_nil
|
97
95
|
sched.delete
|
98
96
|
end
|
@@ -173,11 +171,11 @@ describe GoodData::Schedule do
|
|
173
171
|
before(:each) do
|
174
172
|
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
175
173
|
end
|
176
|
-
|
174
|
+
|
177
175
|
after(:each) do
|
178
176
|
@schedule.delete
|
179
177
|
end
|
180
|
-
|
178
|
+
|
181
179
|
it 'Should return executable as string' do
|
182
180
|
res = @schedule.executable
|
183
181
|
res.should_not be_nil
|
@@ -204,6 +202,32 @@ describe GoodData::Schedule do
|
|
204
202
|
end
|
205
203
|
end
|
206
204
|
|
205
|
+
describe '#execute' do
|
206
|
+
before(:each) do
|
207
|
+
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
208
|
+
@process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
|
209
|
+
type: 'RUBY',
|
210
|
+
name: 'Test ETL zipped file GoodData Process')
|
211
|
+
@schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
212
|
+
end
|
213
|
+
|
214
|
+
after(:each) do
|
215
|
+
@schedule.delete
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'Waits for execution result by default' do
|
219
|
+
res = @schedule.execute
|
220
|
+
expect(res).to be_an_instance_of(GoodData::Execution)
|
221
|
+
expect([:ok, :error].include?(res.status)).to be_truthy
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'can be overridden to do not wait for execution result' do
|
225
|
+
res = @schedule.execute(:wait => false)
|
226
|
+
expect(res).to be_an_instance_of(GoodData::Execution)
|
227
|
+
expect([:scheduled, :running].include?(res.status)).to be_truthy
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
207
231
|
describe '#execution_url' do
|
208
232
|
before(:each) do
|
209
233
|
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
@@ -222,6 +246,7 @@ describe GoodData::Schedule do
|
|
222
246
|
end
|
223
247
|
|
224
248
|
describe '#type' do
|
249
|
+
|
225
250
|
before(:each) do
|
226
251
|
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
227
252
|
end
|
@@ -455,11 +480,11 @@ describe GoodData::Schedule do
|
|
455
480
|
before(:each) do
|
456
481
|
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
457
482
|
end
|
458
|
-
|
483
|
+
|
459
484
|
after(:each) do
|
460
485
|
@schedule.delete
|
461
486
|
end
|
462
|
-
|
487
|
+
|
463
488
|
it 'Should return reschedule as integer' do
|
464
489
|
res = @schedule.reschedule
|
465
490
|
res.should_not be_nil
|
@@ -471,17 +496,17 @@ describe GoodData::Schedule do
|
|
471
496
|
before(:each) do
|
472
497
|
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
473
498
|
end
|
474
|
-
|
499
|
+
|
475
500
|
after(:each) do
|
476
501
|
@schedule.delete
|
477
502
|
end
|
478
|
-
|
503
|
+
|
479
504
|
it 'Assigns the reschedule and marks the object dirty' do
|
480
505
|
test_reschedule = 45
|
481
|
-
|
506
|
+
|
482
507
|
@schedule.reschedule = test_reschedule
|
483
508
|
expect(@schedule.reschedule).to eq(test_reschedule)
|
484
509
|
expect(@schedule.dirty).to eq(true)
|
485
510
|
end
|
486
511
|
end
|
487
|
-
end
|
512
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'gooddata'
|
2
|
+
|
3
|
+
def check_filters(filters)
|
4
|
+
filters.count.should == 2
|
5
|
+
filter = filters.first
|
6
|
+
filter[:login].should == "john.doe@example.com"
|
7
|
+
filter[:filters].count.should == 1
|
8
|
+
filter[:filters].first[:values].count.should == 4
|
9
|
+
filter[:filters].first[:values].should == ["USA", "Czech Republic", "Uganda", "Slovakia"]
|
10
|
+
filter = filters.last
|
11
|
+
filter[:login].should == "jane.doe@example.com"
|
12
|
+
filter[:filters].count.should == 1
|
13
|
+
filter[:filters].first[:values].count.should == 1
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'User filters implementation' do
|
17
|
+
|
18
|
+
it "should create user filters from a file using row based approach" do
|
19
|
+
filters = GoodData::UserFilterBuilder::get_filters('./spec/data/line_based_permissions.csv', {
|
20
|
+
:labels => [
|
21
|
+
{:label => "/gdc/md/lu292gm1077gtv7i383hjl149sva7o1e/obj/2719"},
|
22
|
+
]
|
23
|
+
});
|
24
|
+
check_filters(filters)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should create user filters from a file using column based approach" do
|
28
|
+
filters = GoodData::UserFilterBuilder::get_filters('./spec/data/column_based_permissions.csv', {
|
29
|
+
:labels => [
|
30
|
+
{:label => "/gdc/md/lu292gm1077gtv7i383hjl149sva7o1e/obj/2719", :column => 'region'},
|
31
|
+
]
|
32
|
+
});
|
33
|
+
check_filters(filters)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should treat empty like nil, empty value has to be enclosed in quotes" do
|
37
|
+
filters = GoodData::UserFilterBuilder::get_filters('./spec/data/column_based_permissions.csv', {
|
38
|
+
:labels => [
|
39
|
+
{:label => "some_label", :column => 'region'},
|
40
|
+
{:label => "other_label", :column => 'department'}
|
41
|
+
]
|
42
|
+
});
|
43
|
+
filters.first[:filters].last[:values].count.should == 3
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should be able to specify columns by number" do
|
47
|
+
filters = GoodData::UserFilterBuilder::get_filters('./spec/data/column_based_permissions2.csv', {
|
48
|
+
:user_column => 2,
|
49
|
+
:labels => [
|
50
|
+
{:label => "some_label", :column => 0},
|
51
|
+
{:label => "other_label", :column => 1}
|
52
|
+
]
|
53
|
+
});
|
54
|
+
filters.first[:filters].last[:values].count.should == 2
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should be able to specify columns by name" do
|
58
|
+
filters = GoodData::UserFilterBuilder::get_filters('./spec/data/column_based_permissions2.csv', {
|
59
|
+
:user_column => 'login',
|
60
|
+
:labels => [
|
61
|
+
{:label => 'some_label', :column => 'region'},
|
62
|
+
{:label => 'other_label', :column => 'department'}
|
63
|
+
]
|
64
|
+
});
|
65
|
+
filters.first[:filters].last[:values].count.should == 2
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should normalize simplifed filters" do
|
69
|
+
filters = [
|
70
|
+
[
|
71
|
+
"svarovsky+gem_tester@gooddata.com",
|
72
|
+
"/gdc/md/zndbmx87kh69vk8liods10mwxesaxn3k/obj/213",
|
73
|
+
"tomas@gooddata.com",
|
74
|
+
"jirka@gooddata.com"
|
75
|
+
]
|
76
|
+
]
|
77
|
+
GoodData::UserFilterBuilder.normalize_filters(filters).should == [
|
78
|
+
{
|
79
|
+
:login =>"svarovsky+gem_tester@gooddata.com",
|
80
|
+
:filters => [
|
81
|
+
{
|
82
|
+
:label => "/gdc/md/zndbmx87kh69vk8liods10mwxesaxn3k/obj/213",
|
83
|
+
:values => ["tomas@gooddata.com", "jirka@gooddata.com"]
|
84
|
+
}
|
85
|
+
]
|
86
|
+
}
|
87
|
+
]
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,259 @@
|
|
1
|
+
require 'gooddata'
|
2
|
+
|
3
|
+
ROW_BASED_DATA = [
|
4
|
+
['tomas@gooddata.com', 'US', 'CZ', 'KZ'],
|
5
|
+
['petr@gooddata.com', 'US'],
|
6
|
+
['petr@gooddata.com','KZ']
|
7
|
+
]
|
8
|
+
COLUMN_BASED_DATA_WITH_HEADERS = [
|
9
|
+
{
|
10
|
+
:login => 'tomas@gooddata.com',
|
11
|
+
:country => 'US',
|
12
|
+
:age => 14
|
13
|
+
},
|
14
|
+
{
|
15
|
+
:login => 'petr@gooddata.com',
|
16
|
+
:country => 'US',
|
17
|
+
:age => 19
|
18
|
+
},
|
19
|
+
{
|
20
|
+
:login => 'petr@gooddata.com',
|
21
|
+
:country => 'KZ',
|
22
|
+
:age => 30
|
23
|
+
}
|
24
|
+
]
|
25
|
+
|
26
|
+
COLUMN_BASED_DATA_WITH_HEADERS_AND_NIL_VAL = [
|
27
|
+
{
|
28
|
+
:login => 'tomas@gooddata.com',
|
29
|
+
:country => 'US',
|
30
|
+
:age => 14
|
31
|
+
},
|
32
|
+
{
|
33
|
+
:login => 'petr@gooddata.com',
|
34
|
+
:country => 'US',
|
35
|
+
:age => 19
|
36
|
+
},
|
37
|
+
{
|
38
|
+
:login => 'petr@gooddata.com',
|
39
|
+
:country => 'KZ',
|
40
|
+
:age => nil
|
41
|
+
}
|
42
|
+
]
|
43
|
+
|
44
|
+
COLUMN_BASED_DATA_WITH_HEADERS_AND_EMPTY_VAL = [
|
45
|
+
{
|
46
|
+
:login => 'tomas@gooddata.com',
|
47
|
+
:country => 'US',
|
48
|
+
:age => 14
|
49
|
+
},
|
50
|
+
{
|
51
|
+
:login => 'petr@gooddata.com',
|
52
|
+
:country => 'US',
|
53
|
+
:age => 19
|
54
|
+
},
|
55
|
+
{
|
56
|
+
:login => 'petr@gooddata.com',
|
57
|
+
:country => 'KZ',
|
58
|
+
:age => ''
|
59
|
+
}
|
60
|
+
]
|
61
|
+
|
62
|
+
describe "DSL" do
|
63
|
+
it "should pick the values from row based file" do
|
64
|
+
results = GoodData::UserFilterBuilder::get_values(ROW_BASED_DATA, {
|
65
|
+
:labels => [{:label => "label/34"}]
|
66
|
+
})
|
67
|
+
results.should == {
|
68
|
+
"tomas@gooddata.com"=>[
|
69
|
+
{:label=> "label/34", :values=>["US", "CZ", "KZ"], :over => nil, :to => nil}
|
70
|
+
],
|
71
|
+
"petr@gooddata.com"=> [
|
72
|
+
{:label=> "label/34", :values=>["US"], :over => nil, :to => nil},
|
73
|
+
{:label=> "label/34", :values=>["KZ"], :over => nil, :to => nil}
|
74
|
+
]
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should pick the values from column based file" do
|
79
|
+
results = GoodData::UserFilterBuilder::get_values(COLUMN_BASED_DATA_WITH_HEADERS, {
|
80
|
+
:type => :filter,
|
81
|
+
:user_column => :login,
|
82
|
+
:labels => [{:label => "label/34", :column => :country}]
|
83
|
+
})
|
84
|
+
results.should == {
|
85
|
+
"tomas@gooddata.com"=>[
|
86
|
+
{:label => "label/34", :values=>["US"], :over => nil, :to => nil}
|
87
|
+
],
|
88
|
+
"petr@gooddata.com"=> [
|
89
|
+
{:label=> "label/34", :values=>["US"], :over => nil, :to => nil},
|
90
|
+
{:label=> "label/34", :values=>["KZ"], :over => nil, :to => nil}
|
91
|
+
]
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should pick the values from column based file with multiple columns" do
|
96
|
+
results = GoodData::UserFilterBuilder::get_values(COLUMN_BASED_DATA_WITH_HEADERS, {
|
97
|
+
:type => :filter,
|
98
|
+
:user_column => :login,
|
99
|
+
:labels => [{:label => "label/34", :column => :country}, {:label => "label/99", :column => :age}]
|
100
|
+
})
|
101
|
+
results.should == {
|
102
|
+
"tomas@gooddata.com"=>[
|
103
|
+
{:label=> "label/34", :values=>["US"], :over => nil, :to => nil},
|
104
|
+
{:label=> "label/99", :values=>[14], :over => nil, :to => nil}
|
105
|
+
],
|
106
|
+
"petr@gooddata.com"=> [
|
107
|
+
{:label=>"label/34", :values=>["US"], :over => nil, :to => nil},
|
108
|
+
{:label=>"label/99", :values=>[19], :over => nil, :to => nil},
|
109
|
+
{:label=>"label/34", :values=>["KZ"], :over => nil, :to => nil},
|
110
|
+
{:label=>"label/99", :values=>[30], :over => nil, :to => nil}
|
111
|
+
]
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should process end to end" do
|
116
|
+
result = GoodData::UserFilterBuilder::get_filters(COLUMN_BASED_DATA_WITH_HEADERS, {
|
117
|
+
:user_column => :login,
|
118
|
+
:labels => [{:label => {:uri => "label/34"}, :column => :country}, {:label => {:uri => "label/99"}, :column => :age}]
|
119
|
+
})
|
120
|
+
result.should == [
|
121
|
+
{
|
122
|
+
:login=>"tomas@gooddata.com",
|
123
|
+
:filters=> [
|
124
|
+
{:label=>{:uri=>"label/34"}, :values=>["US"], :over => nil, :to => nil},
|
125
|
+
{:label=>{:uri=>"label/99"}, :values=>[14], :over => nil, :to => nil}
|
126
|
+
]
|
127
|
+
},
|
128
|
+
{
|
129
|
+
:login=>"petr@gooddata.com",
|
130
|
+
:filters => [
|
131
|
+
{:label=>{:uri=>"label/34"}, :values=>["US", "KZ"], :over => nil, :to => nil},
|
132
|
+
{:label=>{:uri=>"label/99"}, :values=>[19, 30], :over => nil, :to => nil}
|
133
|
+
]
|
134
|
+
}
|
135
|
+
]
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should process end to end nil value should be ignored" do
|
139
|
+
result = GoodData::UserFilterBuilder::get_filters(COLUMN_BASED_DATA_WITH_HEADERS_AND_NIL_VAL, {
|
140
|
+
:user_column => :login,
|
141
|
+
:labels => [{:label => {:uri => "label/34"}, :column => :country}, {:label => {:uri => "label/99"}, :column => :age}]
|
142
|
+
})
|
143
|
+
result.should == [
|
144
|
+
{
|
145
|
+
:login=>"tomas@gooddata.com",
|
146
|
+
:filters=> [
|
147
|
+
{:label=>{:uri=>"label/34"}, :values=>["US"], :over => nil, :to => nil},
|
148
|
+
{:label=>{:uri=>"label/99"}, :values=>[14], :over => nil, :to => nil}
|
149
|
+
]
|
150
|
+
},
|
151
|
+
{
|
152
|
+
:login=>"petr@gooddata.com",
|
153
|
+
:filters => [
|
154
|
+
{:label=>{:uri=>"label/34"}, :values=>["US", "KZ"], :over => nil, :to => nil},
|
155
|
+
{:label=>{:uri=>"label/99"}, :values=>[19], :over => nil, :to => nil}
|
156
|
+
]
|
157
|
+
}
|
158
|
+
]
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should process end to end nil value should be ignored" do
|
162
|
+
result = GoodData::UserFilterBuilder::get_filters(COLUMN_BASED_DATA_WITH_HEADERS_AND_EMPTY_VAL, {
|
163
|
+
:user_column => :login,
|
164
|
+
:labels => [{:label => {:uri => "label/34"}, :column => :country}, {:label => {:uri => "label/99"}, :column => :age}]
|
165
|
+
})
|
166
|
+
result.should == [
|
167
|
+
{
|
168
|
+
:login=>"tomas@gooddata.com",
|
169
|
+
:filters=> [
|
170
|
+
{:label=>{:uri=>"label/34"}, :values=>["US"], :over => nil, :to => nil},
|
171
|
+
{:label=>{:uri=>"label/99"}, :values=>[14], :over => nil, :to => nil}
|
172
|
+
]
|
173
|
+
},
|
174
|
+
{
|
175
|
+
:login=>"petr@gooddata.com",
|
176
|
+
:filters => [
|
177
|
+
{:label=>{:uri=>"label/34"}, :values=>["US", "KZ"], :over => nil, :to => nil},
|
178
|
+
{:label=>{:uri=>"label/99"}, :values=>[19, ""], :over => nil, :to => nil}
|
179
|
+
]
|
180
|
+
}
|
181
|
+
]
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should collect values for every user" do
|
185
|
+
data = {
|
186
|
+
"tomas" => [
|
187
|
+
{:label=>"label/34", :values=>["US"]},
|
188
|
+
{:label=>"label/34", :values=>["KZ"]},
|
189
|
+
{:label=>"label/99", :values=>[18]},
|
190
|
+
{:label=>"label/99", :values=>[20]}
|
191
|
+
],
|
192
|
+
"petr" => [
|
193
|
+
{:label=>"label/34", :values=>["US"]},
|
194
|
+
{:label=>"label/99", :values=>[2]},
|
195
|
+
{:label=>"label/99", :values=>[1]}
|
196
|
+
]
|
197
|
+
}
|
198
|
+
result = GoodData::UserFilterBuilder.reduce_results(data)
|
199
|
+
result.should == [{:login=>"tomas",
|
200
|
+
:filters=>
|
201
|
+
[{:label=>"label/34", :values=>["US", "KZ"], :over => nil, :to => nil},
|
202
|
+
{:label=>"label/99", :values=>[18, 20], :over => nil, :to => nil}]},
|
203
|
+
{:login=>"petr",
|
204
|
+
:filters =>
|
205
|
+
[{:label=>"label/34", :values=>["US"], :over => nil, :to => nil},
|
206
|
+
{:label=>"label/99", :values=>[2, 1], :over => nil, :to => nil}]}]
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should collect values for every label" do
|
210
|
+
data = [
|
211
|
+
{:label=>"label/34", :values=>["US"]},
|
212
|
+
{:label=>"label/34", :values=>["KZ"]},
|
213
|
+
{:label=>"label/99", :values=>[18]},
|
214
|
+
{:label=>"label/99", :values=>[20]}
|
215
|
+
]
|
216
|
+
result = GoodData::UserFilterBuilder.collect_labels(data)
|
217
|
+
result.should == [{:label=>"label/34", :values=>["US", "KZ"], :over => nil, :to => nil},
|
218
|
+
{:label=>"label/99", :values=>[18, 20], :over => nil, :to => nil}]
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
it "should collect values" do
|
223
|
+
data = [
|
224
|
+
{:label=>"label/34", :values=>["US"]},
|
225
|
+
{:label=>"label/34", :values=>["KZ"]}
|
226
|
+
]
|
227
|
+
results = GoodData::UserFilterBuilder.collect_values(data)
|
228
|
+
results.should == ["US", "KZ"]
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should translate filters into MAQL filters" do
|
232
|
+
data = [
|
233
|
+
{
|
234
|
+
:login=>"tomas@gooddata.com",
|
235
|
+
:filters=> [
|
236
|
+
{:label => "label/34", :values=>["US"]},
|
237
|
+
{:label => "label/99", :values=>[14]}
|
238
|
+
]
|
239
|
+
},
|
240
|
+
{
|
241
|
+
:login=>"petr@gooddata.com",
|
242
|
+
:filters => [
|
243
|
+
{:label => "label/34", :values=>["US", "KZ"]},
|
244
|
+
{:label=> "label/99", :values=>[19]}
|
245
|
+
]
|
246
|
+
}
|
247
|
+
]
|
248
|
+
results = data.map do |user_data|
|
249
|
+
{
|
250
|
+
:login => user_data[:login],
|
251
|
+
:maql_filter => user_data[:filters].map { |item| "[#{item[:label]}] IN (#{item[:values].join(', ')})" }.join(" AND ")
|
252
|
+
}
|
253
|
+
end
|
254
|
+
results.should == [
|
255
|
+
{:login=>"tomas@gooddata.com", :maql_filter=>"[label/34] IN (US) AND [label/99] IN (14)"},
|
256
|
+
{:login=>"petr@gooddata.com", :maql_filter=>"[label/34] IN (US, KZ) AND [label/99] IN (19)"}
|
257
|
+
]
|
258
|
+
end
|
259
|
+
end
|