protected function queryInternal($fetchMethod, $fetchMode = null, $lazy = true)
    {
        $fetchMode = isset($fetchMode) ? $fetchMode : $this->fetchMode;
        list($profile, $rawSql) = $this->logQuery(__METHOD__);

        $self = $this;
        $execPromise = $this->internalExecute($this->sql, $this->params, $lazy);
        if ($execPromise instanceof LazyPromiseInterface) {
            return $execPromise->thenLazy(
                function($results) use ($fetchMethod, $fetchMode) {
                    return $this->fetchResults($results, $fetchMethod, $fetchMode);
                }
            );
        } else {
            $profileId = $profile ? \Reaction::$app->logger->profile('Query: ' . $rawSql) : null;
            return $execPromise->then(
                function($results) use ($self, $fetchMethod, $fetchMode) {
                    return $self->fetchResults($results, $fetchMethod, $fetchMode);
                }
            )->then(
                function($data) use ($profileId) {
                    \Reaction::profileEnd($profileId);
                    return $data;
                },
                function($error = null) use ($profileId) {
                    \Reaction::profileEnd($profileId);
                    return reject($error);
                }
            );
        }
    }