55
66java_import 'backtype.storm.topology.TopologyBuilder'
77java_import 'backtype.storm.generated.SubmitOptions'
8+ java_import 'backtype.storm.utils.Utils'
89
910module RedStorm
1011 module DSL
@@ -27,16 +28,45 @@ def initialize(component_class, constructor_args, id, parallelism)
2728 @constructor_args = constructor_args
2829 @id = id . to_s
2930 @parallelism = parallelism
30- @output_fields = [ ]
31+ @output_fields = Hash . new ( [ ] )
32+
33+ initialize_output_fields
3134 end
3235
33- def output_fields ( *args )
34- args . empty? ? @output_fields : @output_fields = args . map ( &:to_s )
36+ def output_fields ( *fields )
37+ default_fields = [ ]
38+ fields . each do |field |
39+ case field
40+ when Hash
41+ field . each { |k , v | @output_fields [ k . to_s ] = v . kind_of? ( Array ) ? v . map ( &:to_s ) : [ v . to_s ] }
42+ else
43+ default_fields |= field . kind_of? ( Array ) ? field . map ( &:to_s ) : [ field . to_s ]
44+ end
45+ end
46+ @output_fields [ Utils ::DEFAULT_STREAM_ID ] = default_fields unless default_fields . empty?
47+
48+ @output_fields
3549 end
3650
3751 def is_java?
3852 @clazz . name . split ( '::' ) . first . downcase == 'java'
3953 end
54+
55+ private
56+
57+ def initialize_output_fields
58+ if @clazz . ancestors . include? ( RedStorm ::DSL ::OutputFields )
59+ @output_fields = @clazz . fields . clone
60+ end
61+ end
62+
63+ def java_safe_fields
64+ java_hash = java . util . HashMap . new ( )
65+ @output_fields . each do |k , v |
66+ java_hash . put ( k , v . to_java ( 'java.lang.String' ) ) unless v . empty?
67+ end
68+ java_hash
69+ end
4070 end
4171
4272 class SpoutDefinition < ComponentDefinition
@@ -48,7 +78,7 @@ def new_instance
4878 elsif is_java?
4979 @clazz . new ( *constructor_args )
5080 else
51- Object . module_eval ( @clazz . java_proxy ) . new ( @clazz . base_class_path , @clazz . name , @output_fields )
81+ Object . module_eval ( @clazz . java_proxy ) . new ( @clazz . base_class_path , @clazz . name , java_safe_fields )
5282 end
5383 end
5484 end
@@ -61,29 +91,33 @@ def initialize(*args)
6191 @sources = [ ]
6292 end
6393
64- def source ( source_id , grouping )
65- @sources << [ source_id . is_a? ( Class ) ? Topology . underscore ( source_id ) : source_id . to_s , grouping . is_a? ( Hash ) ? grouping : { grouping => nil } ]
94+ def source ( source_id , grouping , stream = Utils ::DEFAULT_STREAM_ID )
95+ @sources << [
96+ source_id . is_a? ( Class ) ? Topology . underscore ( source_id ) : source_id . to_s ,
97+ grouping . is_a? ( Hash ) ? grouping : { grouping => nil } ,
98+ stream . to_s
99+ ]
66100 end
67101
68102 def define_grouping ( declarer )
69- @sources . each do |source_id , grouping |
103+ @sources . each do |source_id , grouping , stream |
70104 grouper , params = grouping . first
71105 # declarer.fieldsGrouping(source_id, Fields.new())
72106 case grouper
73107 when :fields
74- declarer . fieldsGrouping ( source_id , Fields . new ( *( [ params ] . flatten . map ( &:to_s ) ) ) )
108+ declarer . fieldsGrouping ( source_id , stream , Fields . new ( *( [ params ] . flatten . map ( &:to_s ) ) ) )
75109 when :global
76- declarer . globalGrouping ( source_id )
110+ declarer . globalGrouping ( source_id , stream )
77111 when :shuffle
78- declarer . shuffleGrouping ( source_id )
112+ declarer . shuffleGrouping ( source_id , stream )
79113 when :local_or_shuffle
80- declarer . localOrShuffleGrouping ( source_id )
114+ declarer . localOrShuffleGrouping ( source_id , stream )
81115 when :none
82- declarer . noneGrouping ( source_id )
116+ declarer . noneGrouping ( source_id , stream )
83117 when :all
84- declarer . allGrouping ( source_id )
118+ declarer . allGrouping ( source_id , stream )
85119 when :direct
86- declarer . directGrouping ( source_id )
120+ declarer . directGrouping ( source_id , stream )
87121 else
88122 raise ( "unknown grouper=#{ grouper . inspect } " )
89123 end
@@ -97,7 +131,7 @@ def new_instance
97131 elsif is_java?
98132 @clazz . new ( *constructor_args )
99133 else
100- Object . module_eval ( @clazz . java_proxy ) . new ( @clazz . base_class_path , @clazz . name , @output_fields )
134+ Object . module_eval ( @clazz . java_proxy ) . new ( @clazz . base_class_path , @clazz . name , java_safe_fields )
101135 end
102136 end
103137 end
0 commit comments