@Override
 public void contributeRuntimeOperator(
     IHyracksJobBuilder builder,
     JobGenContext context,
     ILogicalOperator op,
     IOperatorSchema propagatedSchema,
     IOperatorSchema[] inputSchemas,
     IOperatorSchema outerPlanSchema)
     throws AlgebricksException {
   ScriptOperator scriptOp = (ScriptOperator) op;
   IScriptDescription scriptDesc = scriptOp.getScriptDescription();
   if (scriptDesc.getKind() != ScriptKind.STRING_STREAMING) {
     throw new IllegalStateException();
   }
   StringStreamingScriptDescription sssd = (StringStreamingScriptDescription) scriptDesc;
   StringStreamingRuntimeFactory runtime =
       new StringStreamingRuntimeFactory(
           sssd.getCommand(),
           sssd.getPrinterFactories(),
           sssd.getFieldDelimiter(),
           sssd.getParserFactory());
   RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(op, propagatedSchema, context);
   builder.contributeMicroOperator(scriptOp, runtime, recDesc);
   // and contribute one edge from its child
   ILogicalOperator src = scriptOp.getInputs().get(0).getValue();
   builder.contributeGraphEdge(src, 0, scriptOp, 0);
 }
 @Override
 public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
   ScriptOperator s = (ScriptOperator) op;
   computeDeliveredPropertiesForUsedVariables(s, s.getInputVariables());
 }