/** * @param OrmFilterDatasourceAdapter $ds * * @return string */ protected function getJoinIdentifier(OrmFilterDatasourceAdapter $ds) { list($joinAlias, $class) = explode('.', $this->getOr(FilterUtility::DATA_NAME_KEY)); $em = $ds->getQueryBuilder()->getEntityManager(); $metadata = $em->getClassMetadata($class); $fieldNames = $metadata->getIdentifierFieldNames(); if ($count = count($fieldNames) !== 1) { throw new LogicException('Class needs to have exactly 1 identifier, but it has "%d"', $count); } return sprintf('%s.%s', $joinAlias, $fieldNames[0]); }
/** * @param OrmFilterDatasourceAdapter $ds * @param string $unit */ protected function qbPrepare(OrmFilterDatasourceAdapter $ds, $unit) { $qb = $ds->getQueryBuilder(); $rootAliasCollection = $qb->getRootAliases(); $rootAlias = reset($rootAliasCollection); $joinAlias = $this->getJoinAlias(); $currency = $this->get('data_name'); $qb->innerJoin('OroB2BPricingBundle:ProductPrice', $joinAlias, Join::WITH, $rootAlias . '.id = IDENTITY(' . $joinAlias . '.product)'); $this->addEqExpr($ds, $joinAlias . '.currency', $ds->generateParameterName('currency'), $currency); $this->addEqExpr($ds, $joinAlias . '.quantity', $ds->generateParameterName('quantity'), 1); $this->addEqExpr($ds, 'IDENTITY(' . $joinAlias . '.unit)', $ds->generateParameterName('unit'), $unit); }
/** * Builds filtering expression by tags ids and entity class name * * @param OrmFilterDatasourceAdapter $ds * @param array $data * * @param string $entityClassParam * * @return bool|Func */ protected function buildFilterExpr(OrmFilterDatasourceAdapter $ds, array $data, $entityClassParam) { $expr = false; $qb = $ds->getQueryBuilder(); $entityIdAlias = $this->get(FilterUtility::DATA_NAME_KEY); $taggingAlias = $ds->generateParameterName('tagging'); $tagAlias = $ds->generateParameterName('tag'); $subQueryDQL = $qb->getEntityManager()->getRepository('OroTagBundle:Tagging')->createQueryBuilder($taggingAlias)->select($taggingAlias . '.recordId')->join($taggingAlias . '.tag', $tagAlias)->where(sprintf('%s.entityName = :%s', $taggingAlias, $entityClassParam))->andWhere($qb->expr()->in($tagAlias . '.id', $data['value']))->getDQL(); switch ($data['type']) { case DictionaryFilterType::TYPE_IN: $expr = $ds->expr()->in($entityIdAlias, $subQueryDQL); break; case DictionaryFilterType::TYPE_NOT_IN: $expr = $ds->expr()->notIn($entityIdAlias, $subQueryDQL); break; default: break; } return $expr; }
/** * @param OrmFilterDatasourceAdapter $activityDs * @param array $data * * @return string */ protected function createRelatedActivityDql(OrmFilterDatasourceAdapter $activityDs, array $data) { $grid = $this->createRelatedActivityGrid($data); $qb = $grid->getDatasource()->getQueryBuilder(); $alias = $qb->getRootAliases()[0]; if ($joinPart = $qb->getDQLPart('join')) { $lastGroup = end($joinPart); $alias = end($lastGroup)->getAlias(); } $field = $this->getField(); $ds = new OrmFilterDatasourceAdapter($grid->getDatasource()->getQueryBuilder()); $this->applyFilter($ds, $data['filter']['filter'], sprintf('%s.%s', $alias, $field), $data['filter']['data']); $qb->select('1'); $this->copyParameters($qb, $activityDs->getQueryBuilder()); $metadata = $qb->getEntityManager()->getClassMetadata($this->getRelatedActivityClass($data)); $dql = $qb->getDQL(); if ($qb->getRootAliases()[0] !== $alias) { $dql = str_replace($alias, $ds->generateParameterName('raj'), $dql); } $dql .= sprintf(' AND %s.%s = %s.relatedActivityId', $qb->getRootAliases()[0], $this->getIdentifier($metadata), $this->activityListAlias); return str_replace($qb->getRootAliases()[0], $ds->generateParameterName('ra'), $dql); }
/** * Constructor * * @param QueryBuilder $qb */ public function __construct(QueryBuilder $qb) { parent::__construct($qb); $this->expressionBuilder = new ExpressionBuilder(); }
/** * @param OrmFilterDatasourceAdapter $ds * @return string */ protected function parseQueryCondition(OrmFilterDatasourceAdapter $ds) { $qb = $ds->getQueryBuilder(); $parameters = array(); foreach ($qb->getParameters() as $param) { /* @var $param Query\Parameter */ $parameters[':' . $param->getName()] = $param->getValue(); } $parts = $qb->getDQLParts(); $where = ''; if ($parts['where']) { $where = str_replace(array_keys($parameters), array_values($parameters), (string) $parts['where']); } return $where; }
/** * @param OrmFilterDatasourceAdapter $ds * @param string $rootEntity * @param string $rootAlias * @param string $rootField * @param string $relAlias * @param string $relJoinType * * @return QueryBuilder */ protected function createSubQueryBuilder(OrmFilterDatasourceAdapter $ds, $rootEntity, $rootAlias, $rootField, $relAlias, $relJoinType) { $qb = $ds->createQueryBuilder()->select($rootAlias)->from($rootEntity, $rootAlias); if ($relJoinType === 'LEFT') { $qb->leftJoin(sprintf('%s.%s', $rootAlias, $rootField), $relAlias); } else { $qb->innerJoin(sprintf('%s.%s', $rootAlias, $rootField), $relAlias); } return $qb; }
/** * Constructor * * @param QueryBuilder $qb */ public function __construct(QueryBuilder $qb) { parent::__construct($qb); $this->resetState(); }
/** * @param OrmFilterDatasourceAdapter $ds * @param string $objectClass * @param string $fieldName * @param array $data */ protected function applyNewAuditValueFilter(OrmFilterDatasourceAdapter $ds, $objectClass, $fieldName, array $data) { if ($data['auditFilter']['type'] !== static::TYPE_CHANGED_TO_VALUE) { return; } $metadata = $ds->getQueryBuilder()->getEntityManager()->getClassMetadata($objectClass); $type = $metadata->getTypeOfField($fieldName); if (!$type) { $type = 'text'; } $newValueField = sprintf('new%s', ucfirst(AuditFieldTypeRegistry::getAuditType($type))); $this->applyFilter($ds, $data['filter']['filter'], sprintf('%s.%s', $this->auditFieldAlias, $newValueField), $data['filter']['data']); }