use of io.hops.hopsworks.common.featurestore.query.filter.FilterLogic in project hopsworks by logicalclocks.
the class PreparedStatementBuilder method buildDTO.
private ServingPreparedStatementDTO buildDTO(Query query, List<Feature> primaryKeys, Integer featureGroupId, Integer statementIndex, boolean batch) throws FeaturestoreException {
// create primary key prepared statement filters for the query
List<PreparedStatementParameterDTO> stmtParameters = new ArrayList<>();
// Change the type of PK to PREPARED_STATEMENT_TYPE. This will avoid having the query constructor
// adding additional quotes around the ? sign
primaryKeys.forEach(f -> f.setType(PREPARED_STATEMENT_TYPE));
// record pk position in the prepared statement - start from 1 as that's how
// prepared statements work.
int primaryKeyIndex = 1;
// First condition doesn't have any "AND"
// we are guaranteed there is at least one primary key, as no primary key situations are filtered above
Feature pkFeature = primaryKeys.get(0);
stmtParameters.add(new PreparedStatementParameterDTO(pkFeature.getName(), primaryKeyIndex++));
FilterLogic filterLogic;
if (batch) {
filterLogic = new FilterLogic(new Filter(primaryKeys, SqlCondition.IN, "?"));
query.setOrderByFeatures(primaryKeys);
} else {
filterLogic = new FilterLogic(new Filter(Arrays.asList(pkFeature), SqlCondition.EQUALS, "?"));
}
// Concatenate conditions
for (int i = 1; i < primaryKeys.size(); i++) {
pkFeature = primaryKeys.get(i);
if (!batch) {
filterLogic = filterLogic.and(new Filter(Arrays.asList(pkFeature), SqlCondition.EQUALS, "?"));
}
stmtParameters.add(new PreparedStatementParameterDTO(pkFeature.getName(), primaryKeyIndex++));
}
query.setFilter(filterLogic);
// set prepared statement parameters
return new ServingPreparedStatementDTO(featureGroupId, statementIndex, stmtParameters, constructorController.generateSQL(query, true).toSqlString(new MysqlSqlDialect(SqlDialect.EMPTY_CONTEXT)).getSql());
}
use of io.hops.hopsworks.common.featurestore.query.filter.FilterLogic in project hopsworks by logicalclocks.
the class TrainingDatasetControllerTest method testconvertToFilterEntities_bothLogic.
@Test
public void testconvertToFilterEntities_bothLogic() throws Exception {
// fg.feature > 1 and (fg.feature > 2 OR fg.feature > 3)
// "fg.feature > 1" stores as filter logic
TrainingDataset trainingDataset = new TrainingDataset();
Feature f1 = new Feature("test_f", "fg0");
FilterLogic head = new FilterLogic();
head.setType(AND);
FilterLogic left = new FilterLogic();
Filter left_left = new Filter(f1, GREATER_THAN, "1");
left.setType(SINGLE);
left.setLeftFilter(left_left);
head.setLeftLogic(left);
FilterLogic right = new FilterLogic();
right.setType(OR);
Filter right_left = new Filter(f1, GREATER_THAN, "2");
Filter right_right = new Filter(f1, GREATER_THAN, "3");
right.setLeftFilter(right_left);
right.setRightFilter(right_right);
head.setRightLogic(right);
List<TrainingDatasetFilter> actual = target.convertToFilterEntities(head, trainingDataset, "L");
List<TrainingDatasetFilter> expected = new ArrayList<>();
expected.add(createTrainingDatasetFilter(null, AND, "L"));
expected.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "1"), SINGLE, "L.L"));
expected.add(createTrainingDatasetFilter(null, OR, "L.R"));
expected.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "2"), SINGLE, "L.R.L"));
expected.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "3"), SINGLE, "L.R.R"));
Assert.assertEquals(expected.size(), actual.size());
Assert.assertTrue(expected.containsAll(actual));
Assert.assertTrue(actual.containsAll(expected));
}
use of io.hops.hopsworks.common.featurestore.query.filter.FilterLogic in project hopsworks by logicalclocks.
the class TrainingDatasetControllerTest method testconvertToFilterEntities_leftOnlyFilter.
@Test
public void testconvertToFilterEntities_leftOnlyFilter() throws Exception {
// fg.feature > 2
// "fg.feature > 2" stores in the left-hand side
TrainingDataset trainingDataset = new TrainingDataset();
Feature f1 = new Feature("test_f", "fg0");
FilterLogic head = new FilterLogic();
head.setType(SINGLE);
Filter right = new Filter(f1, GREATER_THAN, "2");
head.setLeftFilter(right);
List<TrainingDatasetFilter> actual = target.convertToFilterEntities(head, trainingDataset, "L");
List<TrainingDatasetFilter> expected = new ArrayList<>();
expected.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "2"), SINGLE, "L"));
Assert.assertEquals(expected.size(), actual.size());
Assert.assertTrue(expected.containsAll(actual));
Assert.assertTrue(actual.containsAll(expected));
}
use of io.hops.hopsworks.common.featurestore.query.filter.FilterLogic in project hopsworks by logicalclocks.
the class TrainingDatasetControllerTest method testConvertToFilterLogic_multipleConditions.
public void testConvertToFilterLogic_multipleConditions() throws Exception {
// fg.feature > 1 and fg.feature > 2
List<TrainingDatasetFilter> filters = new ArrayList<>();
filters.add(createTrainingDatasetFilter(null, AND, "L"));
filters.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "2", 0), SINGLE, "L.R"));
filters.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "1", 0), SINGLE, "L.L"));
Map<String, Feature> featureLookup = Maps.newHashMap();
Feature feature = new Feature("test_f", "fg0");
Featuregroup featuregroup = new Featuregroup();
featuregroup.setId(0);
feature.setFeatureGroup(featuregroup);
featureLookup.put("0.test_f", feature);
FilterLogic actual = target.convertToFilterLogic(filters, featureLookup, "L");
Feature f1 = new Feature("test_f", "fg0", null, false, null, null);
f1.setFeatureGroup(featuregroup);
Filter left = new Filter(f1, GREATER_THAN, "1");
Filter right = new Filter(f1, GREATER_THAN, "2");
Assert.assertEquals(actual.getType(), AND);
Assert.assertEquals(actual.getLeftFilter(), left);
Assert.assertNull(actual.getLeftLogic());
Assert.assertEquals(actual.getRightFilter(), right);
Assert.assertNull(actual.getRightLogic());
}
use of io.hops.hopsworks.common.featurestore.query.filter.FilterLogic in project hopsworks by logicalclocks.
the class TrainingDatasetControllerTest method testconvertToFilterEntities_bothFilter.
@Test
public void testconvertToFilterEntities_bothFilter() throws Exception {
// fg.feature > 1 and fg.feature > 2
// "fg.feature > 1" and "fg.feature > 2" stores as filter
TrainingDataset trainingDataset = new TrainingDataset();
Feature f1 = new Feature("test_f", "fg0");
FilterLogic head = new FilterLogic();
head.setType(AND);
Filter left = new Filter(f1, GREATER_THAN, "1");
head.setLeftFilter(left);
Filter right = new Filter(f1, GREATER_THAN, "2");
head.setRightFilter(right);
List<TrainingDatasetFilter> actual = target.convertToFilterEntities(head, trainingDataset, "L");
List<TrainingDatasetFilter> expected = new ArrayList<>();
expected.add(createTrainingDatasetFilter(null, AND, "L"));
expected.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "2"), SINGLE, "L.R"));
expected.add(createTrainingDatasetFilter(createTrainingDatasetFilterCondition("test_f", GREATER_THAN, "1"), SINGLE, "L.L"));
Assert.assertEquals(expected.size(), actual.size());
Assert.assertTrue(expected.containsAll(actual));
Assert.assertTrue(actual.containsAll(expected));
}
Aggregations