private function _loadFromQuery(Product $product = null)
 {
     if (null === $this->_queryBuilder) {
         throw new \LogicException('Cannot load from query as query has not been built yet');
     }
     $result = $this->_queryBuilder->run();
     $units = [];
     foreach ($result as $row) {
         if (!array_key_exists($row->id, $units)) {
             $unit = new UnitProxy($this->_entityLoaderCollection, $this->_locale, $this->_prices, $this->_defaultCurrency);
             $unit->id = $row->id;
             $unit->barcode = $row->barcode;
             $unit->weight = $row->weight;
             $unit->supplierRef = $row->supplierRef;
             $unit->revisionID = $row->revisionID;
             $unit->options = [];
             $unit->setSKU($row->sku);
             $unit->setVisible((bool) $row->visible);
             if ($product) {
                 $unit->setProduct($product);
             } else {
                 $unit->setProductID($row->productID);
             }
             $unit->authorship->create(new DateTimeImmutable(date('c', $row->createdAt)), $row->createdBy);
             if ($row->updatedAt) {
                 $unit->authorship->update(new DateTimeImmutable(date('c', $row->updatedAt)), $row->updatedBy);
             }
             if ($row->deletedAt) {
                 $unit->authorship->delete(new DateTimeImmutable(date('c', $row->deletedAt)), $row->deletedBy);
             }
             $units[$row->id] = $unit;
         }
         $unit = $units[$row->id];
         if ($row->optionName && $row->optionValue && !array_key_exists($row->optionName, $unit->options)) {
             $unit->options[$row->optionName] = $row->optionValue;
         }
         if (!array_key_exists($row->stockLocation, $unit->stock)) {
             $unit->stock[$row->stockLocation] = $row->stock;
         }
         $unit->setPrice($row->price, $row->priceType, $row->currencyID);
     }
     return $this->_returnArray ? $units : array_shift($units);
 }