/**
  * @param array $ids
  * @param array $columns
  * @return array
  */
 public function read($ids, $columns)
 {
     foreach ($columns as $key => $value) {
         if ($value == 'unhashedPassword') {
             unset($columns[$key]);
         }
     }
     $builder = $this->getBuilder($columns, $ids);
     $query = $builder->getQuery();
     $query->setHydrationMode(AbstractQuery::HYDRATE_ARRAY);
     $paginator = $this->manager->createPaginator($query);
     $customers = $paginator->getIterator()->getArrayCopy();
     $result['default'] = DbAdapterHelper::decodeHtmlEntities($customers);
     return $result;
 }
 /**
  * @param $start
  * @param $limit
  * @param $filter
  * @return array
  * @throws \Exception
  */
 public function readRecordIds($start, $limit, $filter)
 {
     $stockFilter = $filter['stockFilter'];
     if ($stockFilter === null) {
         $stockFilter = 'all';
     }
     $builder = $this->modelManager->createQueryBuilder();
     $builder->select('d.id')->from(Detail::class, 'd')->leftJoin('d.prices', 'p');
     switch ($stockFilter) {
         case 'all':
             $builder->where($builder->expr()->isNotNull('d.id'));
             break;
         case 'inStock':
             $builder->where('d.inStock > 0');
             break;
         case 'notInStock':
             $builder->where('d.inStock <= 0');
             break;
         case 'inStockOnSale':
             $builder->leftJoin('d.article', 'a')->where('d.inStock > 0')->andWhere('a.lastStock = 1');
             break;
         case 'notInStockOnSale':
             $builder->leftJoin('d.article', 'a')->where('d.inStock <= 0')->andWhere('a.lastStock = 1');
             break;
         case 'notInStockMinStock':
             $builder->where('d.stockMin >= d.inStock')->andWhere('d.stockMin > 0');
             break;
         case 'custom':
             switch ($filter['direction']) {
                 case 'greaterThan':
                     $builder->where('d.inStock >= :filterValue');
                     break;
                 case 'lessThan':
                     $builder->where('d.inStock <= :filterValue');
                     break;
             }
             $builder->setParameter('filterValue', (int) $filter['value']);
             // unset filterValues for prevent query errors
             if (isset($filter['direction'])) {
                 unset($filter['direction']);
             }
             if (isset($filter['value'])) {
                 unset($filter['value']);
             }
             break;
         default:
             throw new \Exception('Cannot match StockFilter - File:ArticlesInStockAdapter Line:' . __LINE__);
     }
     if (isset($filter['stockFilter'])) {
         unset($filter['stockFilter']);
     }
     $builder->andWhere("p.customerGroupKey = 'EK'")->andWhere("p.from = 1")->orderBy('d.id', 'ASC');
     if (!empty($filter)) {
         $builder->addFilter($filter);
     }
     if ($start) {
         $builder->setFirstResult($start);
     }
     if ($limit) {
         $builder->setMaxResults($limit);
     }
     $query = $builder->getQuery();
     $query->setHydrationMode(AbstractQuery::HYDRATE_ARRAY);
     $paginator = $this->modelManager->createPaginator($query);
     $records = $paginator->getIterator()->getArrayCopy();
     $result = [];
     if ($records) {
         foreach ($records as $value) {
             $result[] = $value['id'];
         }
     }
     return $result;
 }