code: @SuppressWarnings("rawtypes")
  	private DStreamExecutionGraph doBuild(boolean isDependent){	
  		this.invocationPipeline.getInvocations().forEach(this::addInvocation);
  		
  		if (this.requiresInitialSetOfOperations()){
  			this.createDefaultExtractOperation();
  		}
  		if (this.requiresPostShuffleOperation(isDependent)){
  			SerFunction loadFunc = this.determineUnmapFunction(this.currentStreamOperation.getLastOperationName());
  			this.currentStreamOperation = new DStreamOperation(this.operationIdCounter++, this.currentStreamOperation);
  			this.currentStreamOperation.addStreamOperationFunction(Ops.load.name(), loadFunc);
  		}
  		
  		DStreamOperation parent = this.currentStreamOperation;			
  		List<DStreamOperation> operationList = new ArrayList<>();
  		do {
  			operationList.add(parent);
  			parent = parent.getParent();
  		} while (parent != null);	
  		Collections.reverse(operationList);
  		//	
  		
  		DStreamExecutionGraph operations = new DStreamExecutionGraph(
  				this.invocationPipeline.getSourceElementType(), 
  				this.invocationPipeline.getSourceIdentifier(), 
  				Collections.unmodifiableList(operationList));
  		
  		return operations;
  	}
docs: The 'dependentStream' attribute implies that the DStreamOperations the methid is about to build
  is a dependency of another DStreamOperations (e.g., for cases such as Join, union etc.)
  Basically, each process should have at least two operations - 'read -> write' with shuffle in between.
  For cases where we are building a dependent operations the second operation is actually
  implicit (the operation that does the join, union etc.).