public function execute($hydrationMode = self::RESULT_TYPE_HYDRATED)
    {
        if ($hydrationMode !== self::RESULT_TYPE_NONE) {
            $items = $this->getResultIterator();
        }

        // Send requests until the queue is empty
        while (!empty($this->queue)) {
            $pool = new \Aws\CommandPool($this->dm->getClient(), $this->getQueue(), [
                'concurrency'            => $this->poolSize,
                'fulfilled'              => $this->getFulfilledCallback($items, $hydrationMode),
                'rejected'               => $this->getRejectedCallback(),
                'preserve_iterator_keys' => true
            ]);

            $pool->promise()->wait();

            if ($this->isPaging()) {
                break;
            }
        }

        if ($hydrationMode === self::RESULT_TYPE_NONE) {
            return true;
        } elseif ($hydrationMode === self::RESULT_TYPE_SDK) {
            return new SdkResultIterator($items);
        }

        return new IteratorIterator($items);
    }