Class QueryBuilder<O>

  • Type Parameters:
    O - Object type

    public class QueryBuilder<O>
    extends java.lang.Object
    Class to build a query.

    TODO: move this class to the elki-core-api module, linking the linear-scan dependencies via dynamic class loading instead?

    TODO: use a service loader to load optimization modules.

    Since:
    0.8.0
    Author:
    Erich Schubert
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private elki.distance.Distance<? super O> distance
      Distance to query
      private elki.database.query.distance.DistanceQuery<O> distQuery
      Bound distance to query
      static int FLAG_CHEAP_ONLY
      Cheap query only - do not build indexes automatically
      static int FLAG_EXACT_ONLY
      Exact queries only
      static int FLAG_LINEAR_ONLY
      Linear scans only
      static int FLAG_NO_CACHE
      Do not keep auto-generated indexes (c.f., MaterializeKNNPreprocessor).
      static int FLAG_OPTIMIZED_ONLY
      Optimized queries only, no linear scans
      static int FLAG_PRECOMPUTE
      Flag indicating expected pairwise usage / need for precomputation.
      private int flags
      Query flags
      static int FLAGS_NO_INHERIT
      Flags that are not inherited to nested distanceQuery calls.
      static int FLAGS_NO_OPTIMIZER
      Flags that do not allow the optimizer to run.
      private static elki.logging.Logging LOG
      Class logger.
      private static QueryOptimizer OPTIMIZER
      Global query optimizer, populated at startup.
      private elki.database.relation.Relation<O> relation
      Relation to query.
      private elki.similarity.Similarity<? super O> similarity
      Similarity to query
      private elki.database.query.similarity.SimilarityQuery<O> simQuery
      Bound similarity to query
    • Constructor Summary

      Constructors 
      Constructor Description
      QueryBuilder​(elki.database.query.distance.DistanceQuery<? super O> distQuery)
      Constructor.
      QueryBuilder​(elki.database.query.similarity.SimilarityQuery<? super O> simQuery)
      Constructor.
      QueryBuilder​(elki.database.relation.Relation<O> relation, elki.distance.Distance<? super O> distance)
      Constructor.
      QueryBuilder​(elki.database.relation.Relation<O> relation, elki.similarity.Similarity<? super O> similarity)
      Constructor.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      QueryBuilder<O> cheapOnly()
      Only perform the cheapest optimizations, used to indicate that the query will not be used much.
      elki.database.query.distance.DistanceQuery<O> distanceQuery()
      Build a distance query.
      QueryBuilder<O> exactOnly()
      Only accept exact methods, no approximate methods.
      private static QueryOptimizer initStaticOptimizer()
      Initialization method, which sets OPTIMIZER.
      elki.database.query.knn.KNNSearcher<elki.database.ids.DBIDRef> kNNByDBID()
      Build a k-nearest-neighbors query; if possible also give a maximum k.
      elki.database.query.knn.KNNSearcher<elki.database.ids.DBIDRef> kNNByDBID​(int maxk)
      Build a k-nearest-neighbors query.
      elki.database.query.knn.KNNSearcher<O> kNNByObject()
      Build a k-nearest-neighbors query; if possible also give a maximum k.
      elki.database.query.knn.KNNSearcher<O> kNNByObject​(int maxk)
      Build a k-nearest-neighbors query.
      QueryBuilder<O> linearOnly()
      Only build linear-scan queries, useful as reference for evaluation of approximate methods.
      private void logNotAccelerated​(java.lang.String kind)
      Log if we have to fall back to a linear scan.
      private void logUsing​(elki.index.Index index, java.lang.String kind, boolean used)
      Log if we use a particular index.
      QueryBuilder<O> noCache()
      Avoid caching optimizations such as computing a distance matrix, because the results will be used to, e.g., build a similar data structure.
      QueryBuilder<O> optimizedOnly()
      Only query for optimized functions, returning null otherwise.
      QueryBuilder<O> precomputed()
      Indicate that the almost all pairwise distances / each objects knn will be used multiple times, and results should be precomputed and cached.
      elki.database.query.PrioritySearcher<elki.database.ids.DBIDRef> priorityByDBID()
      Build a priority searcher.
      elki.database.query.PrioritySearcher<elki.database.ids.DBIDRef> priorityByDBID​(double maxrange)
      Build a priority searcher.
      elki.database.query.PrioritySearcher<O> priorityByObject()
      Build a priority searcher.
      elki.database.query.PrioritySearcher<O> priorityByObject​(double maxrange)
      Build a priority searcher.
      elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> rangeByDBID()
      Build a range query; if possible also give a maximum query radius.
      elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> rangeByDBID​(double maxrange)
      Build a range query with maximum radius.
      elki.database.query.range.RangeSearcher<O> rangeByObject()
      Build a range query; if possible also give a maximum query radius.
      elki.database.query.range.RangeSearcher<O> rangeByObject​(double maxrange)
      Build a range query with maximum radius.
      elki.database.query.rknn.RKNNSearcher<elki.database.ids.DBIDRef> rKNNByDBID()
      Build a reverse k-nearest neighbors query.
      elki.database.query.rknn.RKNNSearcher<elki.database.ids.DBIDRef> rKNNByDBID​(int k)
      Build a reverse k-nearest neighbors query.
      elki.database.query.rknn.RKNNSearcher<O> rKNNByObject()
      Build a reverse k-nearest neighbors query.
      elki.database.query.rknn.RKNNSearcher<O> rKNNByObject​(int k)
      Build a reverse k-nearest neighbors query.
      elki.database.query.similarity.SimilarityQuery<O> similarityQuery()
      Build a similarity query.
      elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> similarityRangeByDBID()
      Build a similarity range query; if possible also specify the least selective threshold.
      elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> similarityRangeByDBID​(double threshold)
      Build a similarity range query.
      elki.database.query.range.RangeSearcher<O> similarityRangeByObject()
      Build a similarity range query; if possible also specify the least selective threshold.
      elki.database.query.range.RangeSearcher<O> similarityRangeByObject​(double threshold)
      Build a similarity range query.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • LOG

        private static final elki.logging.Logging LOG
        Class logger.
      • FLAG_LINEAR_ONLY

        public static final int FLAG_LINEAR_ONLY
        Linear scans only
        See Also:
        Constant Field Values
      • FLAG_OPTIMIZED_ONLY

        public static final int FLAG_OPTIMIZED_ONLY
        Optimized queries only, no linear scans
        See Also:
        Constant Field Values
      • FLAG_EXACT_ONLY

        public static final int FLAG_EXACT_ONLY
        Exact queries only
        See Also:
        Constant Field Values
      • FLAG_CHEAP_ONLY

        public static final int FLAG_CHEAP_ONLY
        Cheap query only - do not build indexes automatically
        See Also:
        Constant Field Values
      • FLAG_NO_CACHE

        public static final int FLAG_NO_CACHE
        Do not keep auto-generated indexes (c.f., MaterializeKNNPreprocessor).
        See Also:
        Constant Field Values
      • FLAG_PRECOMPUTE

        public static final int FLAG_PRECOMPUTE
        Flag indicating expected pairwise usage / need for precomputation.
        See Also:
        Constant Field Values
      • FLAGS_NO_OPTIMIZER

        public static final int FLAGS_NO_OPTIMIZER
        Flags that do not allow the optimizer to run.
        See Also:
        Constant Field Values
      • FLAGS_NO_INHERIT

        public static final int FLAGS_NO_INHERIT
        Flags that are not inherited to nested distanceQuery calls.
        See Also:
        Constant Field Values
      • OPTIMIZER

        private static final QueryOptimizer OPTIMIZER
        Global query optimizer, populated at startup.
      • relation

        private elki.database.relation.Relation<O> relation
        Relation to query.
      • distance

        private elki.distance.Distance<? super O> distance
        Distance to query
      • similarity

        private elki.similarity.Similarity<? super O> similarity
        Similarity to query
      • distQuery

        private elki.database.query.distance.DistanceQuery<O> distQuery
        Bound distance to query
      • simQuery

        private elki.database.query.similarity.SimilarityQuery<O> simQuery
        Bound similarity to query
      • flags

        private int flags
        Query flags
    • Constructor Detail

      • QueryBuilder

        public QueryBuilder​(elki.database.relation.Relation<O> relation,
                            elki.distance.Distance<? super O> distance)
        Constructor.
        Parameters:
        relation - Relation to query
      • QueryBuilder

        public QueryBuilder​(elki.database.query.distance.DistanceQuery<? super O> distQuery)
        Constructor.
        Parameters:
        distQuery - Query to use
      • QueryBuilder

        public QueryBuilder​(elki.database.relation.Relation<O> relation,
                            elki.similarity.Similarity<? super O> similarity)
        Constructor.
        Parameters:
        relation - Relation to query
      • QueryBuilder

        public QueryBuilder​(elki.database.query.similarity.SimilarityQuery<? super O> simQuery)
        Constructor.
        Parameters:
        simQuery - Query to use
    • Method Detail

      • linearOnly

        public QueryBuilder<O> linearOnly()
        Only build linear-scan queries, useful as reference for evaluation of approximate methods. This can obviously not be combined with FLAG_OPTIMIZED_ONLY.
        Returns:
        query builder, for chaining
      • optimizedOnly

        public QueryBuilder<O> optimizedOnly()
        Only query for optimized functions, returning null otherwise. This allows the user to choose fallback strategies instead. This can obviously not be combined with FLAG_LINEAR_ONLY.
        Returns:
        query builder, for chaining
      • exactOnly

        public QueryBuilder<O> exactOnly()
        Only accept exact methods, no approximate methods.
        Returns:
        query builder, for chaining
      • cheapOnly

        public QueryBuilder<O> cheapOnly()
        Only perform the cheapest optimizations, used to indicate that the query will not be used much.
        Returns:
        query builder, for chaining
      • noCache

        public QueryBuilder<O> noCache()
        Avoid caching optimizations such as computing a distance matrix, because the results will be used to, e.g., build a similar data structure.
        Returns:
        query builder, for chaining
      • precomputed

        public QueryBuilder<O> precomputed()
        Indicate that the almost all pairwise distances / each objects knn will be used multiple times, and results should be precomputed and cached.
        Returns:
        query builder, for chaining
      • distanceQuery

        public elki.database.query.distance.DistanceQuery<O> distanceQuery()
        Build a distance query.
        Returns:
        distance query
      • similarityQuery

        public elki.database.query.similarity.SimilarityQuery<O> similarityQuery()
        Build a similarity query.
        Returns:
        similarity query
      • kNNByObject

        public elki.database.query.knn.KNNSearcher<O> kNNByObject()
        Build a k-nearest-neighbors query; if possible also give a maximum k.
        Returns:
        knn query
      • kNNByObject

        public elki.database.query.knn.KNNSearcher<O> kNNByObject​(int maxk)
        Build a k-nearest-neighbors query.
        Parameters:
        maxk - Maximum k that will be used later.
        Returns:
        knn query
      • kNNByDBID

        public elki.database.query.knn.KNNSearcher<elki.database.ids.DBIDRef> kNNByDBID()
        Build a k-nearest-neighbors query; if possible also give a maximum k.
        Returns:
        knn query
      • kNNByDBID

        public elki.database.query.knn.KNNSearcher<elki.database.ids.DBIDRef> kNNByDBID​(int maxk)
        Build a k-nearest-neighbors query.
        Parameters:
        maxk - Maximum k that will be used later.
        Returns:
        knn query
      • rangeByObject

        public elki.database.query.range.RangeSearcher<O> rangeByObject()
        Build a range query; if possible also give a maximum query radius.
        Returns:
        range query
      • rangeByObject

        public elki.database.query.range.RangeSearcher<O> rangeByObject​(double maxrange)
        Build a range query with maximum radius.
        Parameters:
        maxrange - Maximum radius that will be used.
        Returns:
        range query
      • rangeByDBID

        public elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> rangeByDBID()
        Build a range query; if possible also give a maximum query radius.
        Returns:
        range query
      • rangeByDBID

        public elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> rangeByDBID​(double maxrange)
        Build a range query with maximum radius.
        Parameters:
        maxrange - Maximum radius that will be used.
        Returns:
        range query
      • similarityRangeByObject

        public elki.database.query.range.RangeSearcher<O> similarityRangeByObject()
        Build a similarity range query; if possible also specify the least selective threshold.
        Returns:
        Similarity range query
      • similarityRangeByObject

        public elki.database.query.range.RangeSearcher<O> similarityRangeByObject​(double threshold)
        Build a similarity range query.
        Parameters:
        threshold - smallest similarity that will be queried later
        Returns:
        Similarity range query
      • similarityRangeByDBID

        public elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> similarityRangeByDBID()
        Build a similarity range query; if possible also specify the least selective threshold.
        Returns:
        Similarity range query
      • similarityRangeByDBID

        public elki.database.query.range.RangeSearcher<elki.database.ids.DBIDRef> similarityRangeByDBID​(double threshold)
        Build a similarity range query.
        Parameters:
        threshold - smallest similarity that will be queried later
        Returns:
        Similarity range query
      • rKNNByObject

        public elki.database.query.rknn.RKNNSearcher<O> rKNNByObject()
        Build a reverse k-nearest neighbors query.
        Returns:
        rkNN query
      • rKNNByObject

        public elki.database.query.rknn.RKNNSearcher<O> rKNNByObject​(int k)
        Build a reverse k-nearest neighbors query.
        Parameters:
        k - k to be used; many indexes cannot support arbitrary k.
        Returns:
        rkNN query
      • rKNNByDBID

        public elki.database.query.rknn.RKNNSearcher<elki.database.ids.DBIDRef> rKNNByDBID()
        Build a reverse k-nearest neighbors query.
        Returns:
        rkNN query
      • rKNNByDBID

        public elki.database.query.rknn.RKNNSearcher<elki.database.ids.DBIDRef> rKNNByDBID​(int k)
        Build a reverse k-nearest neighbors query.
        Parameters:
        k - k to be used; many indexes cannot support arbitrary k.
        Returns:
        rkNN query
      • priorityByObject

        public elki.database.query.PrioritySearcher<O> priorityByObject()
        Build a priority searcher.
        Returns:
        priority searcher
      • priorityByObject

        public elki.database.query.PrioritySearcher<O> priorityByObject​(double maxrange)
        Build a priority searcher.
        Parameters:
        maxrange - maximum cut-off
        Returns:
        priority searcher
      • priorityByDBID

        public elki.database.query.PrioritySearcher<elki.database.ids.DBIDRef> priorityByDBID()
        Build a priority searcher.
        Returns:
        priority searcher
      • priorityByDBID

        public elki.database.query.PrioritySearcher<elki.database.ids.DBIDRef> priorityByDBID​(double maxrange)
        Build a priority searcher.
        Parameters:
        maxrange - maximum cut-off
        Returns:
        priority searcher
      • logUsing

        private void logUsing​(elki.index.Index index,
                              java.lang.String kind,
                              boolean used)
        Log if we use a particular index.
        Parameters:
        index - Index tested
        kind - Query kind
        used - true if the index is used.
      • logNotAccelerated

        private void logNotAccelerated​(java.lang.String kind)
        Log if we have to fall back to a linear scan.
        Parameters:
        kind - Query kind
      • initStaticOptimizer

        private static QueryOptimizer initStaticOptimizer()
        Initialization method, which sets OPTIMIZER.
        Returns:
        Optimizer