Skip to content

Commit

Permalink
Merge pull request #1396 from cloudsufi/plugin-1318
Browse files Browse the repository at this point in the history
[PLUGIN-1318] Added ArgumentsColumnsList Exists Validation, Fix PlaceHolder Key
  • Loading branch information
psainics authored Apr 22, 2024
2 parents 9a3e0e1 + 25f0606 commit ef32134
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ public QueryJobConfiguration getQueryJobConfiguration(FailureCollector collector
Map<String, Field> argumentConditionFields = extractArgumentsFields(fields, argumentConditionMap);

checkIfArgumentsColumnsExitsInSource(argumentConditionMap, argumentConditionFields);
checkIfArgumentsColumnsListExistsInSource(getArgumentsColumnsList(), fields, collector);

String selectClause = getSelectClause();
String whereCondition = getWhereCondition(argumentConditionMap.keySet());
Expand Down Expand Up @@ -228,6 +229,25 @@ private void checkIfArgumentsColumnsExitsInSource(Map<String, String> argumentCo
nonExistingColumnNames));
}

static void checkIfArgumentsColumnsListExistsInSource(
List<String> argumentsColumnsList, FieldList fields, FailureCollector collector) {
Set<String> fieldsNames = fields.stream().map(Field::getName).collect(Collectors.toSet());
List<String> nonExistingColumns = argumentsColumnsList.stream()
.filter(columnName -> !fieldsNames.contains(columnName))
.collect(Collectors.toList());
if (!nonExistingColumns.isEmpty()) {
String formattedNonExistingColumnsList = String.join(" ,", nonExistingColumns);
String[] oneManyColumn = {"Column", "Columns"};
String[] oneManyDo = {"does", "do"};
int oneManyIndex = nonExistingColumns.size() == 1 ? 0 : 1;
collector.addFailure(
String.format("%s: \"%s\" %s not exist in table. Argument columns must exist in table.",
oneManyColumn[oneManyIndex], formattedNonExistingColumnsList, oneManyDo[oneManyIndex]),
"Ensure correct column names are provided.")
.withConfigProperty(NAME_ARGUMENTS_COLUMNS);
}
}

private Map<String, Field> extractArgumentsFields(
FieldList fields, Map<String, String> argumentConditionKeyPair) {
return fields.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,33 @@

package io.cdap.plugin.gcp.bigquery.action;

import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.FieldList;
import com.google.cloud.bigquery.LegacySQLTypeName;
import com.google.common.collect.ImmutableList;
import io.cdap.cdap.etl.api.validation.CauseAttributes;
import io.cdap.cdap.etl.api.validation.ValidationException;
import io.cdap.cdap.etl.api.validation.ValidationFailure;
import io.cdap.cdap.etl.mock.validation.MockFailureCollector;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class BigQueryArgumentSetterConfigTest {

private static final String VALID_DATASET = "dataset";
private static final String VALID_DATASET_PROJECT = "datasetProject";
private static final String VALID_TABLE = "table";
private static final String VALID_ARGUMENT_SELECTION_CONDITIONS = "feed=10;id=0";
private static final String VALID_ARGUMENT_COLUMN = "name";
private MockFailureCollector mockFailureCollector;

@Before
public void setUp() {
mockFailureCollector = new MockFailureCollector();
}

@Test
public void testValidateMissingArgumentSelectionConditions() {
Expand All @@ -43,6 +56,47 @@ public void testValidateMissingArgumentColumns() {
validateConfigValidationFail(config, BigQueryArgumentSetterConfig.NAME_ARGUMENTS_COLUMNS);
}

@Test
public void testCheckIfArgumentsColumnsListExistsInSourceMatchOne() {
List<String> argumentsColumnsList = ImmutableList.of("name");
FieldList fields = FieldList.of(Field.newBuilder("name", LegacySQLTypeName.STRING).build());
BigQueryArgumentSetterConfig.checkIfArgumentsColumnsListExistsInSource(argumentsColumnsList, fields,
mockFailureCollector);
Assert.assertEquals(0, mockFailureCollector.getValidationFailures().size());
}

@Test
public void testCheckIfArgumentsColumnsListExistsInSourceMatchSome() {
List<String> argumentsColumnsList = ImmutableList.of("name");
FieldList fields = FieldList.of(Field.newBuilder("name", LegacySQLTypeName.STRING).build(),
Field.newBuilder("age", LegacySQLTypeName.INTEGER).build());
BigQueryArgumentSetterConfig.checkIfArgumentsColumnsListExistsInSource(argumentsColumnsList, fields,
mockFailureCollector);
Assert.assertEquals(0, mockFailureCollector.getValidationFailures().size());
}

@Test
public void testCheckIfArgumentsColumnsListExistsInSourceFailedMatchOne() {
List<String> argumentsColumnsList = ImmutableList.of("name");
FieldList fields = FieldList.of(Field.newBuilder("age", LegacySQLTypeName.INTEGER).build());
BigQueryArgumentSetterConfig.checkIfArgumentsColumnsListExistsInSource(argumentsColumnsList, fields,
mockFailureCollector);
Assert.assertEquals(1, mockFailureCollector.getValidationFailures().size());
Assert.assertEquals("Column: \"name\" does not exist in table. Argument columns must exist in table.",
mockFailureCollector.getValidationFailures().get(0).getMessage());
}

@Test
public void testCheckIfArgumentsColumnsListExistsInSourceFailedMatchSome() {
List<String> argumentsColumnsList = ImmutableList.of("name", "city");
FieldList fields = FieldList.of(Field.newBuilder("age", LegacySQLTypeName.INTEGER).build());
BigQueryArgumentSetterConfig.checkIfArgumentsColumnsListExistsInSource(argumentsColumnsList, fields,
mockFailureCollector);
Assert.assertEquals(1, mockFailureCollector.getValidationFailures().size());
Assert.assertEquals("Columns: \"name ,city\" do not exist in table. Argument columns must exist in table.",
mockFailureCollector.getValidationFailures().get(0).getMessage());
}

private static BigQueryArgumentSetterConfig.Builder getBuilder() {
return BigQueryArgumentSetterConfig.builder()
.setDatasetProject(VALID_DATASET_PROJECT)
Expand Down
2 changes: 1 addition & 1 deletion widgets/BigQueryArgumentSetter-action.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"widget-type": "csv",
"widget-attributes" : {
"delimiter": ",",
"placeholder": "The name of the column that contains the arguments for this run."
"value-placeholder": "The name of the column that contains the arguments for this run."
}
}
]
Expand Down

0 comments on commit ef32134

Please sign in to comment.