code: public Filters.Filter buildFilter(Scan scan, ReadHooks hooks) {
      ChainFilter chain = FILTERS.chain();
      Optional<Filters.Filter> familyFilter = createColumnFamilyFilter(scan);
      if (familyFilter.isPresent()) {
        chain.filter(familyFilter.get());
      }
  
      if (scan.getTimeRange() != null && !scan.getTimeRange().isAllTime()) {
        chain.filter(createTimeRangeFilter(scan.getTimeRange()));
      }
  
      if (scan.getMaxVersions() != Integer.MAX_VALUE) {
        chain.filter(createColumnLimitFilter(scan.getMaxVersions()));
      }
  
      Optional<Filters.Filter> userFilter = createUserFilter(scan, hooks);
      if (userFilter.isPresent()) {
        chain.filter(userFilter.get());
      }
  
      return chain;
    }
docs: Given a {@link Scan}, build a {@link Filters.Filter} that include matching columns
  
  @param scan a {@link Scan} object.
  @param hooks a {@link ReadHooks} object.
  @return a {@link Filters.Filter} object.