Skip to content

Commit e34b2cb

Browse files
authored
[TA] Return action error as in ActionResult (Azure#19013)
Return Actions error in the ...ActionResult classes instead of throwing.
1 parent b41a7ab commit e34b2cb

11 files changed

+1247
-70
lines changed

sdk/textanalytics/azure-ai-textanalytics/src/main/java/com/azure/ai/textanalytics/AnalyzeBatchActionsAsyncClient.java

Lines changed: 87 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@
2727
import com.azure.ai.textanalytics.implementation.models.TasksStateTasksEntityRecognitionPiiTasksItem;
2828
import com.azure.ai.textanalytics.implementation.models.TasksStateTasksEntityRecognitionTasksItem;
2929
import com.azure.ai.textanalytics.implementation.models.TasksStateTasksKeyPhraseExtractionTasksItem;
30+
import com.azure.ai.textanalytics.implementation.models.TextAnalyticsError;
3031
import com.azure.ai.textanalytics.models.AnalyzeBatchActionsOperationDetail;
3132
import com.azure.ai.textanalytics.models.AnalyzeBatchActionsOptions;
3233
import com.azure.ai.textanalytics.models.AnalyzeBatchActionsResult;
3334
import com.azure.ai.textanalytics.models.ExtractKeyPhrasesActionResult;
3435
import com.azure.ai.textanalytics.models.RecognizeEntitiesActionResult;
3536
import com.azure.ai.textanalytics.models.RecognizePiiEntitiesActionResult;
37+
import com.azure.ai.textanalytics.models.TextAnalyticsActionResult;
3638
import com.azure.ai.textanalytics.models.TextAnalyticsActions;
39+
import com.azure.ai.textanalytics.models.TextAnalyticsErrorCode;
3740
import com.azure.ai.textanalytics.models.TextDocumentBatchStatistics;
3841
import com.azure.ai.textanalytics.models.TextDocumentInput;
3942
import com.azure.core.http.rest.PagedFlux;
@@ -51,10 +54,13 @@
5154
import com.azure.core.util.polling.PollingContext;
5255
import reactor.core.publisher.Mono;
5356

57+
import java.util.ArrayList;
5458
import java.util.Arrays;
5559
import java.util.List;
5660
import java.util.Map;
5761
import java.util.function.Function;
62+
import java.util.regex.Matcher;
63+
import java.util.regex.Pattern;
5864
import java.util.stream.Collectors;
5965
import java.util.stream.StreamSupport;
6066

@@ -71,6 +77,9 @@
7177
import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY;
7278

7379
class AnalyzeBatchActionsAsyncClient {
80+
private static final String REGEX_ACTION_ERROR_TARGET =
81+
"#/tasks/(keyPhraseExtractionTasks|entityRecognitionPiiTasks|entityRecognitionTasks)/(\\d+)";
82+
7483
private final ClientLogger logger = new ClientLogger(AnalyzeBatchActionsAsyncClient.class);
7584
private final TextAnalyticsClientImpl service;
7685

@@ -311,45 +320,71 @@ private AnalyzeBatchActionsResult toAnalyzeTasks(AnalyzeJobState analyzeJobState
311320
tasksStateTasks.getEntityRecognitionTasks();
312321
final List<TasksStateTasksKeyPhraseExtractionTasksItem> keyPhraseExtractionTasks =
313322
tasksStateTasks.getKeyPhraseExtractionTasks();
314-
IterableStream<RecognizeEntitiesActionResult> recognizeEntitiesActionResults = null;
315-
IterableStream<RecognizePiiEntitiesActionResult> recognizePiiEntitiesActionResults = null;
316-
IterableStream<ExtractKeyPhrasesActionResult> extractKeyPhrasesActionResults = null;
323+
324+
List<RecognizeEntitiesActionResult> recognizeEntitiesActionResults = new ArrayList<>();
325+
List<RecognizePiiEntitiesActionResult> recognizePiiEntitiesActionResults = new ArrayList<>();
326+
List<ExtractKeyPhrasesActionResult> extractKeyPhrasesActionResults = new ArrayList<>();
317327
if (!CoreUtils.isNullOrEmpty(entityRecognitionTasksItems)) {
318-
recognizeEntitiesActionResults = IterableStream.of(entityRecognitionTasksItems.stream()
319-
.map(taskItem -> {
320-
RecognizeEntitiesActionResult actionResult = new RecognizeEntitiesActionResult();
321-
RecognizeEntitiesActionResultPropertiesHelper.setResult(actionResult,
322-
toRecognizeEntitiesResultCollectionResponse(taskItem.getResults()));
323-
TextAnalyticsActionResultPropertiesHelper.setCompletedAt(actionResult,
324-
taskItem.getLastUpdateDateTime());
325-
return actionResult;
326-
})
327-
.collect(Collectors.toList()));
328+
for (int i = 0; i < entityRecognitionTasksItems.size(); i++) {
329+
final TasksStateTasksEntityRecognitionTasksItem taskItem = entityRecognitionTasksItems.get(i);
330+
final RecognizeEntitiesActionResult actionResult = new RecognizeEntitiesActionResult();
331+
RecognizeEntitiesActionResultPropertiesHelper.setResult(actionResult,
332+
toRecognizeEntitiesResultCollectionResponse(taskItem.getResults()));
333+
TextAnalyticsActionResultPropertiesHelper.setCompletedAt(actionResult,
334+
taskItem.getLastUpdateDateTime());
335+
recognizeEntitiesActionResults.add(actionResult);
336+
}
328337
}
329338
if (!CoreUtils.isNullOrEmpty(piiTasksItems)) {
330-
recognizePiiEntitiesActionResults = IterableStream.of(piiTasksItems.stream()
331-
.map(taskItem -> {
332-
RecognizePiiEntitiesActionResult actionResult = new RecognizePiiEntitiesActionResult();
333-
RecognizePiiEntitiesActionResultPropertiesHelper.setResult(actionResult,
334-
toRecognizePiiEntitiesResultCollection(taskItem.getResults()));
335-
TextAnalyticsActionResultPropertiesHelper.setCompletedAt(actionResult,
336-
taskItem.getLastUpdateDateTime());
337-
return actionResult;
338-
})
339-
.collect(Collectors.toList()));
339+
for (int i = 0; i < piiTasksItems.size(); i++) {
340+
final TasksStateTasksEntityRecognitionPiiTasksItem taskItem = piiTasksItems.get(i);
341+
final RecognizePiiEntitiesActionResult actionResult = new RecognizePiiEntitiesActionResult();
342+
RecognizePiiEntitiesActionResultPropertiesHelper.setResult(actionResult,
343+
toRecognizePiiEntitiesResultCollection(taskItem.getResults()));
344+
TextAnalyticsActionResultPropertiesHelper.setCompletedAt(actionResult,
345+
taskItem.getLastUpdateDateTime());
346+
recognizePiiEntitiesActionResults.add(actionResult);
347+
}
340348
}
341349
if (!CoreUtils.isNullOrEmpty(keyPhraseExtractionTasks)) {
342-
extractKeyPhrasesActionResults = IterableStream.of(keyPhraseExtractionTasks.stream()
343-
.map(taskItem -> {
344-
ExtractKeyPhrasesActionResult actionResult = new ExtractKeyPhrasesActionResult();
345-
ExtractKeyPhrasesActionResultPropertiesHelper.setResult(actionResult,
346-
toExtractKeyPhrasesResultCollection(taskItem.getResults()));
347-
TextAnalyticsActionResultPropertiesHelper.setCompletedAt(actionResult,
348-
taskItem.getLastUpdateDateTime());
349-
return actionResult;
350-
})
351-
.collect(Collectors.toList()));
350+
for (int i = 0; i < keyPhraseExtractionTasks.size(); i++) {
351+
final TasksStateTasksKeyPhraseExtractionTasksItem taskItem = keyPhraseExtractionTasks.get(i);
352+
final ExtractKeyPhrasesActionResult actionResult = new ExtractKeyPhrasesActionResult();
353+
ExtractKeyPhrasesActionResultPropertiesHelper.setResult(actionResult,
354+
toExtractKeyPhrasesResultCollection(taskItem.getResults()));
355+
TextAnalyticsActionResultPropertiesHelper.setCompletedAt(actionResult,
356+
taskItem.getLastUpdateDateTime());
357+
extractKeyPhrasesActionResults.add(actionResult);
358+
}
359+
}
360+
361+
final List<TextAnalyticsError> errors = analyzeJobState.getErrors();
362+
if (!CoreUtils.isNullOrEmpty(errors)) {
363+
for (TextAnalyticsError error : errors) {
364+
final String[] targetPair = parseActionErrorTarget(error.getTarget());
365+
final String taskName = targetPair[0];
366+
final Integer taskIndex = Integer.valueOf(targetPair[1]);
367+
final TextAnalyticsActionResult actionResult;
368+
if ("entityRecognitionTasks".equals(taskName)) {
369+
actionResult = recognizeEntitiesActionResults.get(taskIndex);
370+
} else if ("entityRecognitionPiiTasks".equals(taskName)) {
371+
actionResult = recognizePiiEntitiesActionResults.get(taskIndex);
372+
} else if ("keyPhraseExtractionTasks".equals(taskName)) {
373+
actionResult = extractKeyPhrasesActionResults.get(taskIndex);
374+
} else {
375+
throw logger.logExceptionAsError(new RuntimeException(
376+
"Invalid task name in target reference, " + taskName));
377+
}
378+
379+
TextAnalyticsActionResultPropertiesHelper.setIsError(actionResult, true);
380+
TextAnalyticsActionResultPropertiesHelper.setError(actionResult,
381+
new com.azure.ai.textanalytics.models.TextAnalyticsError(
382+
TextAnalyticsErrorCode.fromString(
383+
error.getCode() == null ? null : error.getCode().toString()),
384+
error.getMessage(), null));
385+
}
352386
}
387+
353388
final AnalyzeBatchActionsResult analyzeBatchActionsResult = new AnalyzeBatchActionsResult();
354389

355390
final RequestStatistics requestStatistics = analyzeJobState.getStatistics();
@@ -363,11 +398,11 @@ private AnalyzeBatchActionsResult toAnalyzeTasks(AnalyzeJobState analyzeJobState
363398

364399
AnalyzeBatchActionsResultPropertiesHelper.setStatistics(analyzeBatchActionsResult, batchStatistics);
365400
AnalyzeBatchActionsResultPropertiesHelper.setRecognizeEntitiesActionResults(analyzeBatchActionsResult,
366-
recognizeEntitiesActionResults);
401+
IterableStream.of(recognizeEntitiesActionResults));
367402
AnalyzeBatchActionsResultPropertiesHelper.setRecognizePiiEntitiesActionResults(analyzeBatchActionsResult,
368-
recognizePiiEntitiesActionResults);
403+
IterableStream.of(recognizePiiEntitiesActionResults));
369404
AnalyzeBatchActionsResultPropertiesHelper.setExtractKeyPhrasesActionResults(analyzeBatchActionsResult,
370-
extractKeyPhrasesActionResults);
405+
IterableStream.of(extractKeyPhrasesActionResults));
371406
return analyzeBatchActionsResult;
372407
}
373408

@@ -425,4 +460,20 @@ private AnalyzeBatchActionsOptions getNotNullAnalyzeBatchActionsOptions(AnalyzeB
425460
private String getNotNullModelVersion(String modelVersion) {
426461
return modelVersion == null ? "latest" : modelVersion;
427462
}
463+
464+
private String[] parseActionErrorTarget(String targetReference) {
465+
if (CoreUtils.isNullOrEmpty(targetReference)) {
466+
throw logger.logExceptionAsError(new RuntimeException(
467+
"Expected an error with a target field referencing an action but did not get one"));
468+
}
469+
// action could be failed and the target reference is "#/tasks/keyPhraseExtractionTasks/0";
470+
final Pattern pattern = Pattern.compile(REGEX_ACTION_ERROR_TARGET, Pattern.MULTILINE);
471+
final Matcher matcher = pattern.matcher(targetReference);
472+
String[] taskNameIdPair = new String[2];
473+
while (matcher.find()) {
474+
taskNameIdPair[0] = matcher.group(1);
475+
taskNameIdPair[1] = matcher.group(2);
476+
}
477+
return taskNameIdPair;
478+
}
428479
}

sdk/textanalytics/azure-ai-textanalytics/src/samples/java/com/azure/ai/textanalytics/lro/AnalyzeBatchActions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static void main(String[] args) {
7272
// Task operation statistics
7373
while (syncPoller.poll().getStatus() == LongRunningOperationStatus.IN_PROGRESS) {
7474
final AnalyzeBatchActionsOperationDetail operationResult = syncPoller.poll().getValue();
75-
System.out.printf("Action display name: %s, Successfully completed tasks: %d, in-process tasks: %d, failed tasks: %d, total tasks: %d%n",
75+
System.out.printf("Action display name: %s, Successfully completed actions: %d, in-process actions: %d, failed actions: %d, total actions: %d%n",
7676
operationResult.getDisplayName(), operationResult.getActionsSucceeded(),
7777
operationResult.getActionsInProgress(), operationResult.getActionsFailed(),
7878
operationResult.getActionsInTotal());

sdk/textanalytics/azure-ai-textanalytics/src/samples/java/com/azure/ai/textanalytics/lro/AnalyzeBatchActionsAsync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static void main(String[] args) {
6262
new AnalyzeBatchActionsOptions().setIncludeStatistics(false))
6363
.flatMap(result -> {
6464
AnalyzeBatchActionsOperationDetail operationResult = result.getValue();
65-
System.out.printf("Action display name: %s, Successfully completed tasks: %d, in-process tasks: %d, failed tasks: %d, total tasks: %d%n",
65+
System.out.printf("Action display name: %s, Successfully completed actions: %d, in-process actions: %d, failed actions: %d, total actions: %d%n",
6666
operationResult.getDisplayName(), operationResult.getActionsSucceeded(),
6767
operationResult.getActionsInProgress(), operationResult.getActionsFailed(), operationResult.getActionsInTotal());
6868
return result.getFinalResult();

0 commit comments

Comments
 (0)