I have an druid extension project that adds new user defined function to Druid SQL, but I have been facing some problems when implementing tests. I have used this example as reference but it is broken, since configureGuice method no longer exists as Druid 32.
I have tried the following by reading the source code from Druid:
@ComponentSupplier(MyComponentSupplier.class)
public class CustomSqlAggregatorTest extends BaseCalciteQueryTest {
@Test
public void testCustomAggSql() {
cannotVectorize();
testBuilder()
.sql("select CUSTOM_AGG(m1) from foo")
.expectedQueries(
List.of(
Druids.newTimeseriesQueryBuilder()
.dataSource(CalciteTests.DATASOURCE1)
.intervals(querySegmentSpec(Filtration.eternity()))
.granularity(Granularities.ALL)
.aggregators(aggregators(getAggFactory()))
.context(QUERY_CONTEXT_DEFAULT)
.build()
)
)
.expectedResults(ImmutableList.of(new Object[]{21.0F}))
.run();
}
...
}
But I get the following error:
Caused by: java.lang.NullPointerException: Cannot read field "componentSupplier" because "config" is null
at org.apache.druid.sql.calcite.SqlTestFrameworkConfig$ConfigurationInstance.<init>(SqlTestFrameworkConfig.java:378)
at org.apache.druid.sql.calcite.SqlTestFrameworkConfig$SqlTestFrameworkConfigStore.getConfigurationInstance(SqlTestFrameworkConfig.java:253)
at org.apache.druid.sql.calcite.SqlTestFrameworkConfig$Rule.get(SqlTestFrameworkConfig.java:344)
at org.apache.druid.sql.calcite.BaseCalciteQueryTest.queryFramework(BaseCalciteQueryTest.java:535)
... 34 more
My component supplier code looks like the following:
public class MyComponentSupplier extends SqlTestFramework.StandardComponentSupplier {
public MyComponentSupplier(TempDirProducer tempDirProducer) {
super(tempDirProducer);
}
@Override
public DruidModule getCoreModule() {
return DruidModuleCollection.of(
super.getCoreModule(),
new MyExtensionModule()
);
}
}
Any suggestions?
I was able to get the test running by adding some code before running the test. The code basically forces Component Supplier to be loaded into the config map. The workaround looks like the following:
@ComponentSupplier(MyComponentSupplier.class)
public class CustomSqlAggregatorTest extends BaseCalciteQueryTest {
@Test
public void testCustomAggSql() {
initializeGuiceConfiguration();
cannotVectorize();
testBuilder()
.sql("select CUSTOM_AGG(m1) from foo")
.expectedQueries(
List.of(
Druids.newTimeseriesQueryBuilder()
.dataSource(CalciteTests.DATASOURCE1)
.intervals(querySegmentSpec(Filtration.eternity()))
.granularity(Granularities.ALL)
.aggregators(aggregators(getAggFactory()))
.context(QUERY_CONTEXT_DEFAULT)
.build()
)
)
.expectedResults(ImmutableList.of(new Object[]{21.0F}))
.run();
}
private static void initializeGuiceConfiguration() {
List<Annotation> annotations = List.of(ArrayWithLimitSqlAggregatorTest.class.getAnnotations());
queryFrameworkRule.setConfig(new SqlTestFrameworkConfig(annotations));
}
...
}
For some reason @ComponentSupplier annotation doesn't seems to be working properly and I couldn't figure out the configuration needed for it to work as it should.