/** * @param OrmFilterDatasourceAdapter $ds * @param string $fieldName * * @return array [entity, alias, field] * * @throws \RuntimeException */ protected function getFilterParts(OrmFilterDatasourceAdapter $ds, $fieldName) { $fieldParts = explode('.', $fieldName); if (count($fieldParts) !== 2) { throw new \RuntimeException(sprintf('It is expected that $fieldName is in "alias.name" format, but "%s" given.', $fieldName)); } $qb = $ds->getQueryBuilder(); $entity = $this->getRootEntity($qb, $fieldParts[0]); if (empty($entity)) { $associations = []; $entity = $this->findEntityByAlias($qb, $fieldParts[0]); while (!empty($entity) && strpos($entity, ':') === false && strpos($entity, '\\') === false) { $parts = explode('.', $entity); array_unshift($associations, $parts[1]); $entity = $this->findEntityByAlias($qb, $parts[0]); } if (empty($entity)) { throw new \RuntimeException(sprintf('Cannot find root entity for "$s". It seems that a query is not valid.', $fieldName)); } foreach ($associations as $assoc) { $entity = $this->doctrine->getManagerForClass($entity)->getClassMetadata($entity)->getAssociationTargetClass($assoc); } } if (empty($entity)) { throw new \RuntimeException(sprintf('Cannot find entity for "$s". It seems that a query is not valid.', $fieldName)); } return [$entity, $fieldParts[0], $fieldParts[1]]; }
/** * @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); }
/** * @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 $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']); }