code: function cacheQuery () {
      // debug
      debug('view:select:collection:get', this.selectCacheKey)
      // get cached value
      var cacheGetPromise = this.cache.redis.getAsync(this.selectCacheKey)
      // store cached value
      .then(res => {
          // skip if not cached
          if (res === null) {
              this.cached = null
          }
          // decode response
          else {
              try {
                  this.cached = JSON.parse(res)
              }
              catch (err) {
                  this.cached = null
              }
          }
      })
      // get the current max record number
      var maxRecordNumberPromise = this.cache.model.maxRecordNumber({
          session: this.query.session,
      }).then(n => {
          // debug
          debug('view:select:collection:initialMaxRecordNumber', n, this.selectCacheKey)
          // store n to check if cache is valid and whether or not
          // query result can be cached
          this.initialMaxRecordNumber = n
      })
      // wait for promises to resolve
      return Promise.all([
          cacheGetPromise,
          maxRecordNumberPromise,
      ])
      .then(() => {
          // return cached value if valid or do query and cache
          return this.cacheValid() ? this.cachedValue() : this.loadUncached()
      })
  }
docs: @function cacheQuery
  
  @returns {Promise}