/** * {@inheritdoc} */ public function getResults() { $options = ['locale_code' => $this->getConfiguration('locale_code'), 'scope_code' => $this->getConfiguration('scope_code'), 'attributes_configuration' => $this->getConfiguration('attributes_configuration'), 'current_group_id' => $this->getConfiguration('current_group_id', false), 'association_type_id' => $this->getConfiguration('association_type_id', false), 'current_product' => $this->getConfiguration('current_product', false)]; if (method_exists($this->qb, 'setParameters')) { QueryBuilderUtility::removeExtraParameters($this->qb); } $rows = $this->hydrator->hydrate($this->qb, $options); return $rows; }
/** * {@inheritdoc} */ public function findCommonAttributeIds(array $productIds) { // Prepare SQL query $commonAttSql = $this->prepareCommonAttributesSQLQuery(); $commonAttSql = strtr($commonAttSql, ['%product_ids%' => '(' . implode($productIds, ',') . ')', '%product_ids_count%' => count($productIds)]); $commonAttSql = QueryBuilderUtility::prepareDBALQuery($this->em, $this->entityName, $commonAttSql); // Execute SQL query $stmt = $this->em->getConnection()->prepare($commonAttSql); $stmt->execute(); $attributes = $stmt->fetchAll(); $attributeIds = array(); foreach ($attributes as $attributeId) { $attributeIds[] = (int) $attributeId['a_id']; } return $attributeIds; }
/** * {@inheritdoc} */ public function getEligibleProductIdsForVariantGroup($variantGroupId) { $sql = 'SELECT v.entity_id AS product_id, gp.group_id, ga.group_id ' . 'FROM pim_catalog_group g ' . 'INNER JOIN pim_catalog_group_attribute ga ON ga.group_id = g.id ' . 'INNER JOIN %product_value_table% v ON v.attribute_id = ga.attribute_id ' . 'LEFT JOIN pim_catalog_group_product gp ON (v.entity_id = gp.product_id) ' . 'INNER JOIN pim_catalog_group_type gt on gt.id = g.type_id ' . 'WHERE ga.group_id = :groupId AND gt.code = "VARIANT" ' . 'AND (v.option_id IS NOT NULL'; if (null !== $this->referenceDataRegistry) { $references = $this->referenceDataRegistry->all(); if (!empty($references)) { $valueMetadata = QueryBuilderUtility::getProductValueMetadata($this->_em, $this->_entityName); foreach ($references as $code => $referenceData) { if (ConfigurationInterface::TYPE_SIMPLE === $referenceData->getType()) { if ($valueMetadata->isAssociationWithSingleJoinColumn($code)) { $sql .= sprintf(' OR v.%s IS NOT NULL', $valueMetadata->getSingleAssociationJoinColumnName($code)); } } } } } $sql .= ') ' . 'GROUP BY v.entity_id ' . 'HAVING (gp.group_id IS NULL OR gp.group_id = ga.group_id) ' . 'AND COUNT(ga.attribute_id) = (SELECT COUNT(*) FROM pim_catalog_group_attribute WHERE group_id = :groupId)'; $sql = QueryBuilderUtility::prepareDBALQuery($this->_em, $this->_entityName, $sql); $stmt = $this->getEntityManager()->getConnection()->prepare($sql); $stmt->bindValue('groupId', $variantGroupId); $stmt->execute(); $results = $stmt->fetchAll(); $productIds = array_map(function ($row) { return $row['product_id']; }, $results); return $productIds; }
/** * Retrieve entity ids, filters, sorters and limits are already in the datasource query builder * * @param DatasourceInterface $datasource * * @return array */ protected function getEntityIds(DatasourceInterface $datasource) { $getIdsQb = clone $datasource->getQueryBuilder(); $rootEntity = current($getIdsQb->getRootEntities()); $rootAlias = $getIdsQb->getRootAlias(); $rootField = $rootAlias . '.id'; $getIdsQb->add('from', new From($rootEntity, $rootAlias, $rootField), false); $getIdsQb->groupBy($rootField); QueryBuilderUtility::removeExtraParameters($getIdsQb); $results = $getIdsQb->getQuery()->getResult(AbstractQuery::HYDRATE_ARRAY); return array_keys($results); }
/** * {@inheritdoc} */ public function computeNbResult() { $qb = clone $this->getQueryBuilder(); $rootAlias = $qb->getRootAlias(); $rootField = $rootAlias . '.id'; $qb->groupBy($rootField); $qb->setFirstResult(null)->setMaxResults(null)->resetDQLPart('orderBy'); QueryBuilderUtility::removeExtraParameters($qb); $query = $qb->getQuery(); return QueryCountCalculator::calculateCount($query); }
/** * @param integer $variantGroupId * * @return array product ids */ public function getEligibleProductIdsForVariantGroup($variantGroupId) { $sql = 'SELECT count(ga.attribute_id) as nb ' . 'FROM pim_catalog_group_attribute as ga ' . 'WHERE ga.group_id = :groupId;'; $stmt = $this->getEntityManager()->getConnection()->prepare($sql); $stmt->bindValue('groupId', $variantGroupId); $stmt->execute(); $nbAxes = $stmt->fetch()['nb']; $sql = 'SELECT v.entity_id ' . 'FROM pim_catalog_group_attribute as ga ' . "LEFT JOIN %product_value_table% as v ON v.attribute_id = ga.attribute_id " . 'WHERE ga.group_id = :groupId ' . 'GROUP BY v.entity_id ' . 'having count(v.option_id) = :nbAxes ;'; $sql = QueryBuilderUtility::prepareDBALQuery($this->_em, $this->_entityName, $sql); $stmt = $this->getEntityManager()->getConnection()->prepare($sql); $stmt->bindValue('groupId', $variantGroupId); $stmt->bindValue('nbAxes', $nbAxes); $stmt->execute(); $results = $stmt->fetchAll(); $productIds = array_map(function ($row) { return $row['entity_id']; }, $results); return $productIds; }
/** * {@inheritdoc} */ public function getEligibleProductIdsForVariantGroup($variantGroupId) { $sql = 'SELECT count(ga.attribute_id) as nb ' . 'FROM pim_catalog_group_attribute as ga ' . 'WHERE ga.group_id = :groupId;'; $stmt = $this->getEntityManager()->getConnection()->prepare($sql); $stmt->bindValue('groupId', $variantGroupId); $stmt->execute(); $nbAxes = $stmt->fetch()['nb']; $elligibleProductsSQL = 'SELECT v.entity_id as product_id ' . 'FROM pim_catalog_group_attribute as ga ' . 'LEFT JOIN %product_value_table% as v ON v.attribute_id = ga.attribute_id ' . 'WHERE ga.group_id = :groupId ' . 'GROUP BY v.entity_id ' . 'having count(v.option_id) = :nbAxes'; $alreadyInGroupSQL = 'SELECT p.id as product_id ' . 'FROM pim_catalog_product as p ' . 'JOIN pim_catalog_group_product as gp on p.id = gp.product_id ' . 'JOIN pim_catalog_group as g on g.id = gp.group_id ' . 'JOIN pim_catalog_group_type as gt on gt.id = g.type_id ' . 'WHERE gt.code = "VARIANT" ' . 'AND g.id != :groupId'; $sql = sprintf('SELECT * FROM (%s) as p WHERE p.product_id NOT IN (%s);', $elligibleProductsSQL, $alreadyInGroupSQL); $sql = QueryBuilderUtility::prepareDBALQuery($this->_em, $this->_entityName, $sql); $stmt = $this->getEntityManager()->getConnection()->prepare($sql); $stmt->bindValue('groupId', $variantGroupId); $stmt->bindValue('nbAxes', $nbAxes); $stmt->execute(); $results = $stmt->fetchAll(); $productIds = array_map(function ($row) { return $row['product_id']; }, $results); return $productIds; }