gd_bam 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/bam +7 -8
- data/lib/bam/version.rb +1 -1
- data/lib/commands/commands.rb +3 -6
- data/lib/commands/deployment.rb +9 -7
- data/lib/generators/etl.rb +10 -0
- data/lib/graphs/goodsales_v2/process_opportunity_line_item.grf +7 -3
- data/lib/graphs/goodsales_v2/process_velocity_duration.grf +125 -94
- data/lib/utils/utils.rb +1 -1
- metadata +281 -269
- data/bin/bam.orig +0 -369
- data/lib/runtime.rb.orig +0 -748
data/bin/bam
CHANGED
@@ -30,14 +30,13 @@ command :generate do |c|
|
|
30
30
|
c.flag :only
|
31
31
|
|
32
32
|
c.action do |global_options,options,args|
|
33
|
-
|
34
|
-
GoodData::Bam::Commands::setup_etl_project('.', PARAMS.merge(options).merge({:project_name => "etl-#{PARAMS[:project_name]}"}))
|
35
|
-
GoodData::Bam::Commands::generate('.', PARAMS.merge(options).merge({
|
33
|
+
params = PARAMS.merge(options).merge({
|
36
34
|
:project_name => "etl-#{PARAMS[:project_name]}",
|
37
35
|
:graph_repos => [
|
38
36
|
GoodData::Bam::Repository.create(:type => :file, :base => Pathname('./local_graphs').expand_path),
|
39
37
|
GoodData::Bam::Repository.create(:type => :file, :base => GoodData::CloverGenerator::BAM_DEFINED_GRAPHS_ROOT)
|
40
|
-
]})
|
38
|
+
]})
|
39
|
+
GoodData::Bam::Commands::generate('.', params)
|
41
40
|
end
|
42
41
|
end
|
43
42
|
|
@@ -292,8 +291,8 @@ command :deploy do |c|
|
|
292
291
|
fail "Specified directory does not exist" unless File.exist?(dir)
|
293
292
|
|
294
293
|
GoodData::Bam::Commands::connect_to_gd()
|
295
|
-
|
296
|
-
response = GoodData::Bam::Commands::deploy(dir,
|
294
|
+
params = PARAMS.merge(global_options.merge(options))
|
295
|
+
response = GoodData::Bam::Commands::deploy(dir, params)
|
297
296
|
end
|
298
297
|
end
|
299
298
|
|
@@ -310,9 +309,9 @@ command :run do |c|
|
|
310
309
|
fail "You have to specify directory to deploy as an argument" if dir.nil?
|
311
310
|
fail "Specified directory does not exist" unless File.exist?(dir)
|
312
311
|
|
313
|
-
|
312
|
+
params = PARAMS.merge(global_options.merge(options))
|
314
313
|
GoodData::Bam::Commands::connect_to_gd()
|
315
|
-
GoodData::Bam::Commands::run(dir,
|
314
|
+
GoodData::Bam::Commands::run(dir, params)
|
316
315
|
end
|
317
316
|
end
|
318
317
|
|
data/lib/bam/version.rb
CHANGED
data/lib/commands/commands.rb
CHANGED
@@ -96,13 +96,10 @@ module GoodData
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def self.generate(home, params)
|
99
|
-
project = GoodData::Bam::Project.build_project(params)
|
100
|
-
|
101
99
|
# fail "The flow you specified was not found" if flows.empty? && !only_flow.nil?
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
v.visit(project, params)
|
100
|
+
GoodData::Bam::Commands::clobber_etl_project('.')
|
101
|
+
GoodData::Bam::Commands::setup_etl_project('.', params)
|
102
|
+
GoodData::Bam::Generators::Etl.generate('.', params)
|
106
103
|
end
|
107
104
|
|
108
105
|
end
|
data/lib/commands/deployment.rb
CHANGED
@@ -32,7 +32,7 @@ module GoodData
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
def self.execute_process(link, dir)
|
35
|
+
def self.execute_process(link, dir, options={})
|
36
36
|
dir = Pathname(dir)
|
37
37
|
result = GoodData.post(link, {
|
38
38
|
:execution => {
|
@@ -59,10 +59,10 @@ module GoodData
|
|
59
59
|
|
60
60
|
dir = Pathname(dir)
|
61
61
|
|
62
|
-
deploy(dir, options.merge(:name => "Temporary deploy[#{dir}][#{
|
62
|
+
deploy(dir, options.merge(:name => "Temporary deploy[#{dir}][#{options[:project_name]}]")) do |deploy_response|
|
63
63
|
puts HighLine::color("Executing", HighLine::BOLD) if verbose
|
64
64
|
if email.nil?
|
65
|
-
result = execute_process(deploy_response["process"]["links"]["executions"], dir)
|
65
|
+
result = execute_process(deploy_response["process"]["links"]["executions"], dir, options)
|
66
66
|
else
|
67
67
|
create_email_channel(options) do |channel_response|
|
68
68
|
subscribe_on_finish(:success, channel_response, deploy_response, options)
|
@@ -128,7 +128,7 @@ module GoodData
|
|
128
128
|
}
|
129
129
|
}
|
130
130
|
profile_id = GoodData.connection.user["profile"].split("/").last
|
131
|
-
GoodData.post("/gdc/projects/#{
|
131
|
+
GoodData.post("/gdc/projects/#{options[:project_pid]}/users/#{profile_id}/subscriptions", data)
|
132
132
|
end
|
133
133
|
|
134
134
|
def self.deploy(dir, options={}, &block)
|
@@ -148,8 +148,10 @@ module GoodData
|
|
148
148
|
|
149
149
|
def self.deploy_graph(dir, options={})
|
150
150
|
dir = Pathname(dir)
|
151
|
-
deploy_name = options[:name] ||
|
151
|
+
deploy_name = options[:name] || options[:project_name]
|
152
152
|
verbose = options[:verbose] || false
|
153
|
+
project_pid = options[:project_pid]
|
154
|
+
|
153
155
|
puts HighLine::color("Deploying #{dir}", HighLine::BOLD) if verbose
|
154
156
|
res = nil
|
155
157
|
|
@@ -174,9 +176,9 @@ module GoodData
|
|
174
176
|
}
|
175
177
|
}
|
176
178
|
res = if process_id.nil?
|
177
|
-
GoodData.post("/gdc/projects/#{
|
179
|
+
GoodData.post("/gdc/projects/#{project_pid}/dataload/processes", data)
|
178
180
|
else
|
179
|
-
GoodData.put("/gdc/projects/#{
|
181
|
+
GoodData.put("/gdc/projects/#{project_pid}/dataload/processes/#{process_id}", data)
|
180
182
|
end
|
181
183
|
end
|
182
184
|
puts HighLine::color("Deploy DONE #{dir}", HighLine::BOLD) if verbose
|
data/lib/generators/etl.rb
CHANGED
@@ -7,6 +7,16 @@ module GoodData
|
|
7
7
|
include GoodData::CloudConnect
|
8
8
|
|
9
9
|
|
10
|
+
def self.generate(home, params={})
|
11
|
+
|
12
|
+
project = GoodData::Bam::Project.build_project(params)
|
13
|
+
fail "There are no flows to generate from" if project[:flows].empty?
|
14
|
+
|
15
|
+
v = Compiler::EtlVisitor.new
|
16
|
+
v.visit(project, params)
|
17
|
+
|
18
|
+
end
|
19
|
+
|
10
20
|
def self.create_es_readmap(metadata, tap)
|
11
21
|
e = Es::Entity.new("x", {
|
12
22
|
:file => "none",
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<Graph author="gdc-defectivedisplay" created="Thu Mar 07 20:20:14 PST 2013" guiVersion="3.3.2" id="1362726965567" licenseType="Commercial" modified="Tue Jun 25 17:05:18 PDT 2013" modifiedBy="tomassvarovsky" name="process_opportunity_line_item" revision="1.36" showComponentDetails="true">
|
2
|
+
<Graph author="gdc-defectivedisplay" created="Thu Mar 07 20:20:14 PST 2013" guiVersion="3.3.2" id="1362726965567" licenseCode="CLP1DGOODD71636137BY" licenseType="Commercial" modified="Tue Jun 25 17:05:18 PDT 2013" modifiedBy="tomassvarovsky" name="process_opportunity_line_item" revision="1.36" showComponentDetails="true">
|
3
3
|
<Global>
|
4
4
|
<Metadata fileURL="${PROJECT}/metadata/${FLOW}/${NAME}/1_in.xml" id="Metadata0"/>
|
5
5
|
<Metadata fileURL="${PROJECT}/metadata/${FLOW}/${NAME}/1_out.xml" id="Metadata1"/>
|
@@ -58,8 +58,12 @@ function integer transform() {
|
|
58
58
|
|
59
59
|
$out.0.* = $in.0.*;
|
60
60
|
|
61
|
-
$out.0.Amount
|
62
|
-
$out.0.
|
61
|
+
$out.0.Amount = nvl2($in.1.TotalPrice, $in.1.TotalPrice, $in.0.Amount);
|
62
|
+
$out.0.OpportunityId = $in.0.Id;
|
63
|
+
$out.0.LineItemId = nvl2($in.1.Id, $in.1.Id, null);
|
64
|
+
$out.0.Id = nvl2($in.1.Id, $in.1.Id, $in.0.Id);
|
65
|
+
|
66
|
+
$out.0.ProductId = nvl2($in.1.PricebookEntryId, $in.1.PricebookEntryId, null);
|
63
67
|
|
64
68
|
return ALL;
|
65
69
|
}
|
@@ -1,15 +1,32 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<Graph author="
|
2
|
+
<Graph author="fluke" created="Tue Feb 05 15:38:24 PST 2013" guiVersion="3.3.2" id="1360179808937" licenseType="Commercial" modified="Sat Jun 29 15:50:00 PDT 2013" modifiedBy="tomassvarovsky" name="process_name" revision="1.75" showComponentDetails="true">
|
3
3
|
<Global>
|
4
4
|
<Metadata fileURL="${PROJECT}/metadata/${FLOW}/${NAME}/1_in.xml" id="Metadata0"/>
|
5
|
-
<Metadata fileURL="${PROJECT}/metadata/${FLOW}/${NAME}/1_out.xml" id="
|
6
|
-
<
|
7
|
-
<
|
8
|
-
<
|
5
|
+
<Metadata fileURL="${PROJECT}/metadata/${FLOW}/${NAME}/1_out.xml" id="Metadata1"/>
|
6
|
+
<MetadataGroup id="ComponentGroup0" name="metadata"/>
|
7
|
+
<Metadata id="Metadata2">
|
8
|
+
<Record fieldDelimiter="," name="InItem" recordDelimiter="\n" type="delimited">
|
9
9
|
<Field name="Id" type="string"/>
|
10
|
-
<Field name="
|
11
|
-
<Field
|
12
|
-
|
10
|
+
<Field name="Stage" type="string"/>
|
11
|
+
<Field name="Date" type="long"/>
|
12
|
+
</Record>
|
13
|
+
</Metadata>
|
14
|
+
<Metadata id="Metadata3">
|
15
|
+
<Record fieldDelimiter="," name="OutItem" recordDelimiter="\n" type="delimited">
|
16
|
+
<Field name="Id" type="string"/>
|
17
|
+
<Field name="Stage" type="string"/>
|
18
|
+
<Field name="Date" type="long"/>
|
19
|
+
<Field name="Duration" type="long"/>
|
20
|
+
<Field name="Velocity" type="long"/>
|
21
|
+
</Record>
|
22
|
+
</Metadata>
|
23
|
+
<Metadata id="Metadata4" previewAttachmentCharset="ISO-8859-1">
|
24
|
+
<Record fieldDelimiter="," name="Output" previewAttachmentCharset="ISO-8859-1" recordDelimiter="\n" type="delimited">
|
25
|
+
<Field name="Id" type="string"/>
|
26
|
+
<Field name="Stage" type="string"/>
|
27
|
+
<Field name="Date" type="string"/>
|
28
|
+
<Field name="Duration" type="string"/>
|
29
|
+
<Field name="Velocity" type="string"/>
|
13
30
|
</Record>
|
14
31
|
</Metadata>
|
15
32
|
<Property fileURL="params.prm" id="GraphParameter0"/>
|
@@ -17,113 +34,120 @@
|
|
17
34
|
<Dictionary/>
|
18
35
|
</Global>
|
19
36
|
<Phase number="0">
|
20
|
-
<Node enabled="enabled"
|
21
|
-
<Node enabled="enabled" fileURL="
|
22
|
-
<Node enabled="enabled" guiHeight="77" guiName="
|
23
|
-
<Node enabled="enabled"
|
37
|
+
<Node aggregateKey="OpportunityId;StageName;ForecastCategoryName;AccountId;OwnerId;CreatedDate;CloseDate;ProductId" enabled="enabled" equalNULL="true" guiHeight="65" guiName="Aggregate" guiWidth="128" guiX="966" guiY="137" id="AGGREGATE0" mapping="$ForecastCategoryName:=$ForecastCategoryName;$AccountId:=$AccountId;$OwnerId:=$OwnerId;$StageName:=$StageName;$CreatedDate:=$CreatedDate;$CloseDate:=$CloseDate;$OpportunityId:=$OpportunityId;$ProductId:=$ProductId;$Velocity:=first($Velocity);$Duration:=sum($Duration);" sorted="true" type="AGGREGATE"/>
|
38
|
+
<Node enabled="enabled" fileURL="data/1_in.csv" guiHeight="77" guiName="CSV Reader" guiWidth="128" guiX="-184" guiY="122" id="DATA_READER0" quoteCharacter=""" quotedStrings="true" skipRows="1" type="DATA_READER"/>
|
39
|
+
<Node enabled="enabled" fileURL="data/out.csv" guiHeight="77" guiName="CSV Writer" guiWidth="128" guiX="1518" guiY="116" id="DATA_WRITER0" outputFieldNames="true" quoteCharacter=""" quotedStrings="true" type="DATA_WRITER"/>
|
40
|
+
<Node enabled="enabled" guiHeight="77" guiName="ExtSort" guiWidth="128" guiX="417" guiY="116" id="EXT_SORT0" sortKey="Id(a);Snapshot(a)" type="EXT_SORT"/>
|
41
|
+
<Node enabled="enabled" guiHeight="89" guiName="ExtSort" guiWidth="128" guiX="787" guiY="113" id="EXT_SORT1" sortKey="OpportunityId(a);ForecastCategoryName(a);AccountId(a);OwnerId(a);StageName(a);CreatedDate(a);CloseDate(a);ProductId(a)" type="EXT_SORT"/>
|
42
|
+
<Node enabled="passThrough" guiHeight="77" guiName="ExtSort" guiWidth="128" guiX="1341" guiY="116" id="EXT_SORT3" sortKey="Id(a);Stage(a)" type="EXT_SORT"/>
|
43
|
+
<Node enabled="passThrough" guiHeight="65" guiName="Reformat" guiWidth="128" guiX="248" guiY="122" id="REFORMAT0" type="REFORMAT">
|
24
44
|
<attr name="transform"><![CDATA[//#CTL2
|
25
45
|
|
26
|
-
//
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
groupAccumulator.size = 0;
|
46
|
+
// Transforms input record into output record.
|
47
|
+
function integer transform() {
|
48
|
+
$out.0.* = $in.0.*;
|
49
|
+
$out.0.Stage = $in.0.StageName;
|
50
|
+
$out.0.Date = date2long(str2date($in.0.Snapshot, 'yyyy-MM-dd'));
|
51
|
+
return ALL;
|
33
52
|
}
|
34
53
|
|
35
|
-
// Called
|
36
|
-
//
|
37
|
-
function boolean updateGroup(recordName2 groupAccumulator) {
|
38
|
-
append(groupAccumulator.dates, $0.Snapshot);
|
39
|
-
append(groupAccumulator.stages, $0.StageName);
|
40
|
-
groupAccumulator.size++;
|
41
|
-
return false;
|
42
|
-
}
|
54
|
+
// Called during component initialization.
|
55
|
+
// function boolean init() {}
|
43
56
|
|
44
|
-
// Called
|
45
|
-
//
|
46
|
-
|
47
|
-
|
48
|
-
}
|
57
|
+
// Called during each graph run before the transform is executed. May be used to allocate and initialize resources
|
58
|
+
// required by the transform. All resources allocated within this method should be released
|
59
|
+
// by the postExecute() method.
|
60
|
+
// function void preExecute() {}
|
49
61
|
|
50
|
-
// Called
|
51
|
-
//
|
52
|
-
|
53
|
-
//
|
54
|
-
//
|
55
|
-
//
|
56
|
-
|
57
|
-
|
58
|
-
}
|
62
|
+
// Called only if transform() throws an exception.
|
63
|
+
// function integer transformOnError(string errorMessage, string stackTrace) {}
|
64
|
+
|
65
|
+
// Called during each graph run after the entire transform was executed. Should be used to free any resources
|
66
|
+
// allocated within the preExecute() method.
|
67
|
+
// function void postExecute() {}
|
68
|
+
|
69
|
+
// Called to return a user-defined error message when an error occurs.
|
70
|
+
// function string getMessage() {}
|
71
|
+
]]></attr>
|
72
|
+
</Node>
|
73
|
+
<Node enabled="enabled" guiHeight="65" guiName="Reformat" guiWidth="128" guiX="610" guiY="122" id="REFORMAT1" type="REFORMAT">
|
74
|
+
<attr name="transform"><![CDATA[//#CTL2
|
75
|
+
|
76
|
+
// Transforms input record into output record.
|
77
|
+
//InItem inItem = null;
|
78
|
+
//OutItem outItem;
|
79
|
+
|
80
|
+
out_1 previous;
|
81
|
+
boolean init = true;
|
59
82
|
|
60
|
-
|
61
|
-
// Counter (incremented by 1 starting from 0) stores the number of previous calls to this method for the current group update.
|
62
|
-
// Group accumulator can optionally be used.
|
63
|
-
// Function implicitly returns SKIP to skip sending any data records to output.
|
64
|
-
// Returning ALL causes each data record to be sent to all output port(s).
|
65
|
-
// Can also return a number of the output port to which individual data record should be sent.
|
66
|
-
function integer transform(integer counter, recordName2 groupAccumulator) {
|
83
|
+
function integer transform() {
|
67
84
|
|
68
|
-
if (
|
69
|
-
|
85
|
+
if (init) {
|
86
|
+
init = false;
|
87
|
+
previous.Velocity = 0;
|
88
|
+
previous.Duration = 0;
|
89
|
+
}
|
90
|
+
|
91
|
+
if (previous.Id == $in.0.Id) {
|
92
|
+
previous.Duration = (date2long(str2date($in.0.Snapshot, 'yyyy-MM-dd')) - date2long(str2date(previous.Snapshot, 'yyyy-MM-dd'))) / 3600 / 24 / 1000;
|
93
|
+
|
94
|
+
|
95
|
+
previous.Velocity = previous.Velocity + ((date2long(str2date($in.0.Snapshot, 'yyyy-MM-dd')) - date2long(str2date(previous.Snapshot, 'yyyy-MM-dd')))/ 3600 / 24 / 1000);
|
96
|
+
copyByName(previous.*,$in.0.*);
|
97
|
+
} else {
|
98
|
+
copyByName(previous.*,$in.0.*);
|
99
|
+
previous.Duration = 0;
|
70
100
|
}
|
71
101
|
|
72
|
-
|
73
|
-
date date0 = str2date(groupAccumulator.dates[0], date_template);
|
74
|
-
date date1 = str2date(groupAccumulator.dates[counter], date_template);
|
75
|
-
string velocity;
|
76
|
-
string duration;
|
77
|
-
date date2;
|
78
|
-
|
79
|
-
if(counter == (length(groupAccumulator.dates) - 1)) {
|
80
|
-
velocity = num2str(dateDiff(date1, date0, day));
|
81
|
-
duration = "0";
|
82
|
-
} else {
|
83
|
-
date2 = str2date(groupAccumulator.dates[counter + 1], date_template);
|
84
|
-
duration = num2str(dateDiff(date2, date1, day));
|
85
|
-
velocity = num2str(dateDiff(date1, date0, day));
|
86
|
-
}
|
87
|
-
|
88
|
-
|
89
|
-
//printErr([groupAccumulator.Id, stage, duration, velocity]);
|
90
|
-
$out.0.* = $in.0.*;
|
91
|
-
$out.0.Id = groupAccumulator.Id;
|
92
|
-
$out.0.StageName = stage;
|
93
|
-
$out.0.Duration = duration;
|
94
|
-
$out.0.Velocity = velocity;
|
95
|
-
|
96
|
-
return ALL;
|
102
|
+
printErr(previous);
|
97
103
|
|
104
|
+
copyByName($out.0.*, previous.*);
|
105
|
+
return ALL;
|
98
106
|
}
|
99
107
|
|
100
108
|
// Called during component initialization.
|
101
|
-
// function
|
109
|
+
// function boolean init() {}
|
102
110
|
|
103
111
|
// Called during each graph run before the transform is executed. May be used to allocate and initialize resources
|
104
112
|
// required by the transform. All resources allocated within this method should be released
|
105
113
|
// by the postExecute() method.
|
106
114
|
// function void preExecute() {}
|
107
115
|
|
108
|
-
// Called only if
|
109
|
-
//function
|
110
|
-
|
116
|
+
// Called only if transform() throws an exception.
|
117
|
+
// function integer transformOnError(string errorMessage, string stackTrace) {}
|
118
|
+
|
119
|
+
// Called during each graph run after the entire transform was executed. Should be used to free any resources
|
120
|
+
// allocated within the preExecute() method.
|
121
|
+
// function void postExecute() {}
|
122
|
+
|
123
|
+
// Called to return a user-defined error message when an error occurs.
|
124
|
+
// function string getMessage() {}
|
125
|
+
]]></attr>
|
126
|
+
</Node>
|
127
|
+
<Node enabled="passThrough" guiHeight="65" guiName="Reformat" guiWidth="128" guiX="1137" guiY="122" id="REFORMAT2" type="REFORMAT">
|
128
|
+
<attr name="transform"><![CDATA[//#CTL2
|
129
|
+
|
130
|
+
// Transforms input record into output record.
|
111
131
|
|
112
|
-
//
|
113
|
-
|
114
|
-
|
132
|
+
// Transforms input record into output record.
|
133
|
+
function integer transform() {
|
134
|
+
$out.0.* = $in.0.*;
|
135
|
+
$out.0.Date = date2str(long2date($in.0.Date), 'yyyy-MM-dd');
|
136
|
+
$out.0.Velocity = toString($in.0.Velocity);
|
137
|
+
$out.0.Duration = toString($in.0.Duration);
|
138
|
+
return ALL;
|
139
|
+
}
|
115
140
|
|
116
|
-
// Called
|
117
|
-
//function boolean
|
118
|
-
//}
|
141
|
+
// Called during component initialization.
|
142
|
+
// function boolean init() {}
|
119
143
|
|
120
|
-
// Called
|
121
|
-
//
|
122
|
-
//
|
144
|
+
// Called during each graph run before the transform is executed. May be used to allocate and initialize resources
|
145
|
+
// required by the transform. All resources allocated within this method should be released
|
146
|
+
// by the postExecute() method.
|
147
|
+
// function void preExecute() {}
|
123
148
|
|
124
|
-
// Called only if transform(
|
125
|
-
//function integer transformOnError(string errorMessage, string stackTrace
|
126
|
-
//}
|
149
|
+
// Called only if transform() throws an exception.
|
150
|
+
// function integer transformOnError(string errorMessage, string stackTrace) {}
|
127
151
|
|
128
152
|
// Called during each graph run after the entire transform was executed. Should be used to free any resources
|
129
153
|
// allocated within the preExecute() method.
|
@@ -133,8 +157,15 @@ function integer transform(integer counter, recordName2 groupAccumulator) {
|
|
133
157
|
// function string getMessage() {}
|
134
158
|
]]></attr>
|
135
159
|
</Node>
|
136
|
-
<
|
137
|
-
<Edge fromNode="
|
138
|
-
<Edge fromNode="
|
160
|
+
<Node enabled="enabled" guiHeight="65" guiName="SimpleCopy" guiWidth="128" guiX="47" guiY="122" id="SIMPLE_COPY0" type="SIMPLE_COPY"/>
|
161
|
+
<Edge fromNode="AGGREGATE0:0" guiBendpoints="" guiRouter="Manhattan" id="Edge6" inPort="Port 0 (in)" metadata="Metadata1" outPort="Port 0 (out)" toNode="REFORMAT2:0"/>
|
162
|
+
<Edge fromNode="DATA_READER0:0" guiBendpoints="" guiRouter="Manhattan" id="Edge0" inPort="Port 0 (in)" metadata="Metadata0" outPort="Port 0 (output)" toNode="SIMPLE_COPY0:0"/>
|
163
|
+
<Edge fromNode="EXT_SORT0:0" guiBendpoints="" guiRouter="Manhattan" id="Edge4" inPort="Port 0 (in)" metadata="Metadata0" outPort="Port 0 (out)" toNode="REFORMAT1:0"/>
|
164
|
+
<Edge debugMode="true" fromNode="EXT_SORT1:0" guiBendpoints="" guiRouter="Manhattan" id="Edge5" inPort="Port 0 (in)" metadata="Metadata1" outPort="Port 0 (out)" toNode="AGGREGATE0:0"/>
|
165
|
+
<Edge fromNode="EXT_SORT3:0" guiBendpoints="" guiRouter="Manhattan" id="Edge13" inPort="Port 0 (in)" metadata="Metadata1" outPort="Port 0 (out)" toNode="DATA_WRITER0:0"/>
|
166
|
+
<Edge fromNode="REFORMAT0:0" guiBendpoints="" guiRouter="Manhattan" id="Edge1" inPort="Port 0 (in)" metadata="Metadata0" outPort="Port 0 (out)" toNode="EXT_SORT0:0"/>
|
167
|
+
<Edge fromNode="REFORMAT1:0" guiBendpoints="" guiRouter="Manhattan" id="Edge3" inPort="Port 0 (in)" metadata="Metadata1" outPort="Port 0 (out)" toNode="EXT_SORT1:0"/>
|
168
|
+
<Edge fromNode="REFORMAT2:0" guiBendpoints="" guiRouter="Manhattan" id="Edge11" inPort="Port 0 (in)" metadata="Metadata1" outPort="Port 0 (out)" toNode="EXT_SORT3:0"/>
|
169
|
+
<Edge fromNode="SIMPLE_COPY0:0" guiBendpoints="" guiRouter="Manhattan" id="Edge7" inPort="Port 0 (in)" metadata="Metadata0" outPort="Port 0 (out)" toNode="REFORMAT0:0"/>
|
139
170
|
</Phase>
|
140
171
|
</Graph>
|
data/lib/utils/utils.rb
CHANGED
@@ -47,7 +47,7 @@ module GoodData
|
|
47
47
|
FileUtils::mkdir_p dir
|
48
48
|
end
|
49
49
|
File.open(home + 'params.prm', 'w') do |f|
|
50
|
-
f << "TRASH=0"
|
50
|
+
f << "TRASH=0\n"
|
51
51
|
end
|
52
52
|
Utils::render_template("project.erb", options, :to_file => home + '.project')
|
53
53
|
Utils::render_template("workspace.prm.erb", options, :to_file => home + 'workspace.prm')
|