diff --git a/build.gradle b/build.gradle index 0dcd0e1a8..d1a8fe413 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ allprojects { group = 'org.vitrivr' /* Our current version, on dev branch this should always be release+1-SNAPSHOT */ - version = '3.8.3' + version = '3.8.4' apply plugin: 'java-library' apply plugin: 'maven-publish' diff --git a/cineast-core/src/main/java/org/vitrivr/cineast/core/db/DBSelector.java b/cineast-core/src/main/java/org/vitrivr/cineast/core/db/DBSelector.java index 82174ecda..852441719 100644 --- a/cineast-core/src/main/java/org/vitrivr/cineast/core/db/DBSelector.java +++ b/cineast-core/src/main/java/org/vitrivr/cineast/core/db/DBSelector.java @@ -79,6 +79,9 @@ default List getNearestNeighboursGeneric(int k, List getBatchedNearestNeighbours(int k, List vectors, String column, Class distanceElementClass, List configs); + /** + * In contrast to {@link #getNearestNeighboursGeneric(int, float[], String, Class, ReadableQueryConfig)}, this method returns all elements of a row + */ List> getNearestNeighbourRows(int k, float[] vector, String column, ReadableQueryConfig config); diff --git a/cineast-core/src/main/java/org/vitrivr/cineast/core/db/cottontaildb/CottontailSelector.java b/cineast-core/src/main/java/org/vitrivr/cineast/core/db/cottontaildb/CottontailSelector.java index dea8d1f17..9ad4df271 100644 --- a/cineast-core/src/main/java/org/vitrivr/cineast/core/db/cottontaildb/CottontailSelector.java +++ b/cineast-core/src/main/java/org/vitrivr/cineast/core/db/cottontaildb/CottontailSelector.java @@ -85,7 +85,7 @@ public List getBatchedNearestNeighbours(int k, Li @Override public List> getNearestNeighbourRows(int k, float[] vector, String column, ReadableQueryConfig config) { - final Query query = knn(k, vector, column, config); + final Query query = knn(k, vector, column, config, "*"); try { return processResults(this.cottontail.client.query(query)); } catch (StatusRuntimeException e) { @@ -314,7 +314,7 @@ public List getUniqueValues(String column) { } public Map countDistinctValues(String column) { - final Query query = new Query(this.fqn).select("*", null); + final Query query = new Query(this.fqn).select(column, null); final Map count = new HashMap<>(); try { final TupleIterator results = this.cottontail.client.query(query); @@ -375,14 +375,32 @@ public boolean ping() { * @return {@link Query} */ private Query knn(int k, float[] vector, String column, ReadableQueryConfig config) { + return knn(k, vector, column, config, GENERIC_ID_COLUMN_QUALIFIER); + } + + /** + * Creates and returns a basic {@link Query} object for the given kNN parameters. + * + * @param k The k parameter used for kNN + * @param vector The query vector (= float array). + * @param column The name of the column that should be queried. + * @param config The {@link ReadableQueryConfig} with additional parameters. + * @param select which rows should be selected + * @return {@link Query} + */ + private Query knn(int k, float[] vector, String column, ReadableQueryConfig config, String... select) { final Set relevant = config.getRelevantSegmentIds(); final Distances distance = toDistance(config.getDistance().orElse(Distance.manhattan)); final Query query = new Query(this.fqn) - .select(GENERIC_ID_COLUMN_QUALIFIER, null) .distance(column, vector, distance, DB_DISTANCE_VALUE_QUALIFIER) .order(DB_DISTANCE_VALUE_QUALIFIER, Direction.ASC) .limit(k); + for (String s : select) { + query.select(s, null); + } + + /* Add relevant segments (optional). */ if (!relevant.isEmpty()) { query.where(new Literal(GENERIC_ID_COLUMN_QUALIFIER, "IN", relevant.toArray()));