use of com.ibm.cohort.cql.library.CqlLibraryDescriptor in project quality-measure-and-cohort-service by Alvearie.
the class SparkSchemaCreator method calculateSchemaForContext.
public StructType calculateSchemaForContext(String contextName) throws Exception {
List<CqlEvaluationRequest> filteredRequests = requests.getEvaluationsForContext(contextName);
StructType resultsSchema = new StructType();
Set<Tuple2<String, String>> usingInfo = new HashSet<>();
for (CqlEvaluationRequest filteredRequest : filteredRequests) {
CqlLibraryDescriptor descriptor = filteredRequest.getDescriptor();
String libraryId = descriptor.getLibraryId();
for (String expression : filteredRequest.getExpressionNames()) {
CqlLibrary providedLibrary = libraryProvider.getLibrary(new CqlLibraryDescriptor().setLibraryId(libraryId).setVersion(descriptor.getVersion()).setFormat(Format.ELM));
if (providedLibrary == null) {
throw new IllegalArgumentException("Library not found: " + descriptor.getLibraryId() + "-" + descriptor.getVersion());
}
Library library = CqlLibraryReader.read(providedLibrary.getContentAsStream());
// Track the set of non-system using statements across libraries.
// Information is used later to access ModelInfos when searching
// for context key column type information.
usingInfo.addAll(library.getUsings().getDef().stream().filter(x -> !x.getLocalIdentifier().equals("System")).map(x -> new Tuple2<>(x.getLocalIdentifier(), x.getVersion())).collect(Collectors.toList()));
List<ExpressionDef> expressionDefs = library.getStatements().getDef().stream().filter(x -> x.getName().equals(expression)).collect(Collectors.toList());
if (expressionDefs.isEmpty()) {
throw new IllegalArgumentException("Expression " + expression + " is configured in the CQL jobs file, but not found in " + descriptor.getLibraryId() + "-" + descriptor.getVersion());
} else if (expressionDefs.size() > 1) {
throw new IllegalArgumentException("Expression " + expression + " was defined multiple times in library: " + descriptor.getLibraryId() + "-" + descriptor.getVersion());
}
QName resultTypeName = expressionDefs.get(0).getExpression().getResultTypeName();
if (resultTypeName == null) {
throw new IllegalArgumentException("Expression " + expression + " has a null result type: " + descriptor.getLibraryId() + "-" + descriptor.getVersion());
}
// The column name encoder already performed duplicate checking. We just need to make sure
// we add each uniquely named column to the output one time.
String columnName = sparkOutputColumnEncoder.getColumnName(filteredRequest, expression);
if (resultsSchema.getFieldIndex(columnName).isEmpty()) {
resultsSchema = resultsSchema.add(columnName, QNameToDataTypeConverter.getFieldType(resultTypeName), true);
}
}
}
if (resultsSchema.fields().length > 0) {
Tuple2<String, DataType> keyInformation = getDataTypeForContextKey(contextName, usingInfo);
StructType fullSchema = new StructType().add(keyInformation._1(), keyInformation._2(), false).add(getParametersColumnName(), DataTypes.StringType, false);
for (StructField field : resultsSchema.fields()) {
fullSchema = fullSchema.add(field);
}
resultsSchema = fullSchema;
}
return resultsSchema;
}
use of com.ibm.cohort.cql.library.CqlLibraryDescriptor in project quality-measure-and-cohort-service by Alvearie.
the class ConfigurableOutputColumnNameEncoderTest method testNamesForMultipleContexts.
@Test
public void testNamesForMultipleContexts() {
CqlLibraryDescriptor libraryDescriptor1 = new CqlLibraryDescriptor();
libraryDescriptor1.setLibraryId("lib1");
CqlEvaluationRequest request = new CqlEvaluationRequest();
request.setDescriptor(libraryDescriptor1);
request.setId(1);
CqlExpressionConfiguration expressionConfiguration1 = new CqlExpressionConfiguration();
expressionConfiguration1.setName("abcd");
expressionConfiguration1.setOutputColumn("A1");
CqlExpressionConfiguration expressionConfiguration2 = new CqlExpressionConfiguration();
expressionConfiguration2.setName("efgh");
expressionConfiguration2.setOutputColumn("A2");
request.setExpressions(new HashSet<>(Arrays.asList(expressionConfiguration1, expressionConfiguration2)));
CqlLibraryDescriptor libraryDescriptor2 = new CqlLibraryDescriptor();
libraryDescriptor2.setLibraryId("lib1");
CqlEvaluationRequest request2 = new CqlEvaluationRequest();
request2.setDescriptor(libraryDescriptor2);
request2.setId(2);
CqlExpressionConfiguration expressionConfiguration3 = new CqlExpressionConfiguration();
expressionConfiguration3.setName("abcd");
expressionConfiguration3.setOutputColumn("A3");
CqlExpressionConfiguration expressionConfiguration4 = new CqlExpressionConfiguration();
expressionConfiguration4.setName("efgh");
expressionConfiguration4.setOutputColumn("A4");
request2.setExpressions(new HashSet<>(Arrays.asList(expressionConfiguration3, expressionConfiguration4)));
request.setContextKey("context1");
request2.setContextKey("context2");
CqlEvaluationRequests evaluationRequests = new CqlEvaluationRequests();
evaluationRequests.setEvaluations(Arrays.asList(request, request2));
ConfigurableOutputColumnNameEncoder nameEncoder = ConfigurableOutputColumnNameEncoder.create(evaluationRequests, "|");
assertEquals("A1", nameEncoder.getColumnName(request, "abcd"));
assertEquals("A2", nameEncoder.getColumnName(request, "efgh"));
assertEquals("A3", nameEncoder.getColumnName(request2, "abcd"));
assertEquals("A4", nameEncoder.getColumnName(request2, "efgh"));
}
use of com.ibm.cohort.cql.library.CqlLibraryDescriptor in project quality-measure-and-cohort-service by Alvearie.
the class ConfigurableOutputColumnNameEncoderTest method testOutputColumnsRepeatedAcrossContexts.
@Test
public void testOutputColumnsRepeatedAcrossContexts() {
CqlLibraryDescriptor libraryDescriptor1 = new CqlLibraryDescriptor();
libraryDescriptor1.setLibraryId("lib1");
CqlEvaluationRequest request = new CqlEvaluationRequest();
request.setDescriptor(libraryDescriptor1);
request.setId(1);
CqlExpressionConfiguration expressionConfiguration1 = new CqlExpressionConfiguration();
expressionConfiguration1.setName("abcd");
expressionConfiguration1.setOutputColumn("A1");
request.setExpressions(new HashSet<>(Collections.singletonList(expressionConfiguration1)));
CqlLibraryDescriptor libraryDescriptor2 = new CqlLibraryDescriptor();
libraryDescriptor2.setLibraryId("lib2");
CqlEvaluationRequest request2 = new CqlEvaluationRequest();
request2.setDescriptor(libraryDescriptor2);
request2.setId(2);
CqlExpressionConfiguration expressionConfiguration2 = new CqlExpressionConfiguration();
expressionConfiguration2.setName("abcd");
expressionConfiguration2.setOutputColumn("A1");
request2.setExpressions(new HashSet<>(Collections.singletonList(expressionConfiguration2)));
request.setContextKey("context1");
request2.setContextKey("context2");
CqlEvaluationRequests evaluationRequests = new CqlEvaluationRequests();
evaluationRequests.setEvaluations(Arrays.asList(request, request2));
ConfigurableOutputColumnNameEncoder nameEncoder = ConfigurableOutputColumnNameEncoder.create(evaluationRequests, "|");
assertEquals("A1", nameEncoder.getColumnName(request, "abcd"));
assertEquals("A1", nameEncoder.getColumnName(request2, "abcd"));
}
use of com.ibm.cohort.cql.library.CqlLibraryDescriptor in project quality-measure-and-cohort-service by Alvearie.
the class ContextColumnNameEncoderTest method testMultipleRequestsSameDefineSameDefaultOutputColumn.
@Test
public void testMultipleRequestsSameDefineSameDefaultOutputColumn() {
String commonLibrary = "lib1";
String commonDefine = "abcd";
CqlLibraryDescriptor libraryDescriptor1 = new CqlLibraryDescriptor();
libraryDescriptor1.setLibraryId(commonLibrary);
CqlEvaluationRequest request = new CqlEvaluationRequest();
request.setDescriptor(libraryDescriptor1);
request.setId(1);
CqlExpressionConfiguration expressionConfiguration1 = new CqlExpressionConfiguration();
expressionConfiguration1.setName(commonDefine);
request.setExpressions(new HashSet<>(Collections.singletonList(expressionConfiguration1)));
CqlLibraryDescriptor libraryDescriptor2 = new CqlLibraryDescriptor();
libraryDescriptor2.setLibraryId(commonLibrary);
CqlEvaluationRequest request2 = new CqlEvaluationRequest();
request2.setDescriptor(libraryDescriptor2);
request2.setId(2);
CqlExpressionConfiguration expressionConfiguration2 = new CqlExpressionConfiguration();
expressionConfiguration2.setName(commonDefine);
request2.setExpressions(new HashSet<>(Collections.singletonList(expressionConfiguration2)));
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> ContextColumnNameEncoder.create(Arrays.asList(request, request2), "|"));
assertTrue(ex.getMessage().contains("Duplicate outputColumn lib1|abcd defined"));
}
use of com.ibm.cohort.cql.library.CqlLibraryDescriptor in project quality-measure-and-cohort-service by Alvearie.
the class ContextColumnNameEncoderTest method testDefinesWithOutputColumns.
@Test
public void testDefinesWithOutputColumns() {
CqlLibraryDescriptor libraryDescriptor = new CqlLibraryDescriptor();
libraryDescriptor.setLibraryId("lib1");
CqlEvaluationRequest request = new CqlEvaluationRequest();
CqlExpressionConfiguration expressionConfiguration1 = new CqlExpressionConfiguration();
expressionConfiguration1.setName("abcd");
expressionConfiguration1.setOutputColumn("A1");
CqlExpressionConfiguration expressionConfiguration2 = new CqlExpressionConfiguration();
expressionConfiguration2.setName("efgh");
expressionConfiguration2.setOutputColumn("A2");
request.setExpressions(new HashSet<>(Arrays.asList(expressionConfiguration1, expressionConfiguration2)));
request.setDescriptor(libraryDescriptor);
request.setId(1);
Map<String, String> defineToOutputNameMap = ContextColumnNameEncoder.getDefineToOutputNameMap(request, "|");
Map<String, String> expectedResult = new HashMap<String, String>() {
{
put("abcd", "A1");
put("efgh", "A2");
}
};
TestCase.assertEquals(expectedResult, defineToOutputNameMap);
}
Aggregations