4343import scala .tools .nsc .settings .Final ;
4444
4545import java .text .MessageFormat ;
46+ import java .lang .reflect .Method ;
4647import java .util .ArrayList ;
4748import java .util .HashMap ;
4849import java .util .Arrays ;
@@ -349,14 +350,17 @@ public String getResult(Job job, int index, int maxSize) {
349350 @ Override
350351 public Map <String , String > getResultVariables (Job job , int maxSize ) {
351352 Map <String , String > variables = new LinkedHashMap <>();
352- Object fileContent = getResultFileContent (job , 0 , maxSize );
353+ Object resultSetResponse = getResultSetResponse (job , 0 , maxSize );
354+ Object fileContent = extractFileContent (resultSetResponse );
355+ Object metaData = extractMetaData (resultSetResponse );
353356 if (fileContent == null ) {
354357 job .getLogObj ().warn ("Branch variable extraction skipped because result file content is null." );
355358 LOGGER .warn ("Branch variable extraction skipped because result file content is null." );
356359 return variables ;
357360 }
358361 job .getLogObj ().info ("Branch variable extraction file content type: " + fileContent .getClass ().getName ());
359362 LOGGER .info ("Branch variable extraction file content type: {}" , fileContent .getClass ().getName ());
363+ LOGGER .info ("Branch variable extraction metadata preview: {}" , previewObject (metaData ));
360364 if (!(fileContent instanceof ArrayList )) {
361365 job .getLogObj ().warn ("Branch variable extraction skipped because result file content is not ArrayList: " + fileContent );
362366 LOGGER .warn ("Branch variable extraction skipped because result file content is not ArrayList: {}" , fileContent );
@@ -374,7 +378,7 @@ public Map<String, String> getResultVariables(Job job, int maxSize) {
374378 if (firstRow instanceof Map ) {
375379 extractVariablesFromMapRows (rows , variables );
376380 } else if (firstRow instanceof ArrayList ) {
377- extractVariablesFromArrayRows (rows , variables );
381+ extractVariablesFromArrayRows (rows , metaData , variables );
378382 } else {
379383 job .getLogObj ().warn ("Branch variable extraction skipped because first row type is unsupported: " + firstRow .getClass ().getName ());
380384 LOGGER .warn ("Branch variable extraction skipped because first row type is unsupported: {}" , firstRow .getClass ().getName ());
@@ -384,7 +388,7 @@ public Map<String, String> getResultVariables(Job job, int maxSize) {
384388 return variables ;
385389 }
386390
387- private void extractVariablesFromArrayRows (ArrayList rows , Map <String , String > variables ) {
391+ private void extractVariablesFromArrayRows (ArrayList rows , Object metaData , Map <String , String > variables ) {
388392 if (rows .size () >= 2 && rows .get (0 ) instanceof ArrayList && rows .get (1 ) instanceof ArrayList ) {
389393 ArrayList headers = (ArrayList ) rows .get (0 );
390394 ArrayList values = (ArrayList ) rows .get (1 );
@@ -404,6 +408,13 @@ private void extractVariablesFromArrayRows(ArrayList rows, Map<String, String> v
404408 ArrayList row = (ArrayList ) rows .get (0 );
405409 if (row .size () == 1 ) {
406410 LOGGER .warn ("Branch variable extraction saw a single-row single-column result: {}. Column name may not be present in fileContent." , row );
411+ String columnName = extractSingleColumnName (metaData );
412+ String value = normalizeCellValue (row .get (0 ));
413+ if (StringUtils .isNotBlank (columnName ) && value != null ) {
414+ variables .put (columnName , value );
415+ LOGGER .info ("Branch variable extraction recovered single-column metadata: {}={}" , columnName , value );
416+ return ;
417+ }
407418 }
408419 }
409420
@@ -438,6 +449,37 @@ private void extractVariablesFromMapRows(ArrayList rows, Map<String, String> var
438449 }
439450 }
440451
452+ private String extractSingleColumnName (Object metaData ) {
453+ if (metaData instanceof Map ) {
454+ Map map = (Map ) metaData ;
455+ String columnName = firstNonBlank (map .get ("columnName" ), map .get ("name" ), map .get ("column" ), map .get ("alias" ));
456+ if (StringUtils .isNotBlank (columnName )) {
457+ return columnName ;
458+ }
459+ }
460+ if (metaData instanceof List && !((List ) metaData ).isEmpty ()) {
461+ Object first = ((List ) metaData ).get (0 );
462+ if (first instanceof Map ) {
463+ Map map = (Map ) first ;
464+ String columnName = firstNonBlank (map .get ("columnName" ), map .get ("name" ), map .get ("column" ), map .get ("alias" ));
465+ if (StringUtils .isNotBlank (columnName )) {
466+ return columnName ;
467+ }
468+ }
469+ }
470+ return null ;
471+ }
472+
473+ private String firstNonBlank (Object ... values ) {
474+ for (Object value : values ) {
475+ String text = normalizeCellValue (value );
476+ if (StringUtils .isNotBlank (text )) {
477+ return text ;
478+ }
479+ }
480+ return null ;
481+ }
482+
441483 private String previewRows (ArrayList rows ) {
442484 int previewSize = Math .min (rows .size (), 3 );
443485 return rows .subList (0 , previewSize ).toString ();
@@ -447,7 +489,37 @@ private String normalizeCellValue(Object value) {
447489 return value == null ? null : value .toString ();
448490 }
449491
450- private Object getResultFileContent (Job job , int index , int maxSize ) {
492+ private String previewObject (Object value ) {
493+ if (value == null ) {
494+ return "null" ;
495+ }
496+ String text = value .toString ();
497+ return text .length () > 300 ? text .substring (0 , 300 ) + "..." : text ;
498+ }
499+
500+ private Object extractFileContent (Object resultSetResponse ) {
501+ return invokeNoArgMethod (resultSetResponse , "getFileContent" , "fileContent" );
502+ }
503+
504+ private Object extractMetaData (Object resultSetResponse ) {
505+ return invokeNoArgMethod (resultSetResponse , "getMetaData" , "getMetadata" , "metaData" , "metadata" , "getMeta" , "meta" );
506+ }
507+
508+ private Object invokeNoArgMethod (Object target , String ... methodNames ) {
509+ if (target == null ) {
510+ return null ;
511+ }
512+ for (String methodName : methodNames ) {
513+ try {
514+ Method method = target .getClass ().getMethod (methodName );
515+ return method .invoke (target );
516+ } catch (Throwable ignored ) {
517+ }
518+ }
519+ return null ;
520+ }
521+
522+ private Object getResultSetResponse (Job job , int index , int maxSize ) {
451523 JobInfoResult jobInfo = getClient (job ).getJobInfo (job .getJobExecuteResult ());
452524 String [] resultSetList = jobInfo .getResultSetList (getClient (job ));
453525 if (resultSetList != null && resultSetList .length > index ) {
0 commit comments