/**
  * @param ForestCollection $collection
  * @return array
  */
 public function getAttributes($collection)
 {
     $ret = array();
     $ret['name'] = $collection->getName();
     $ret['fields'] = $collection->getFields();
     if ($collection->getActions()) {
         $ret['actions'] = $collection->getActions();
     }
     $ret['only-for-relationships'] = null;
     $ret['is-virtual'] = null;
     $ret['is-read-only'] = false;
     $ret['is-searchable'] = true;
     return $ret;
 }
 /**
  * @param QueryBuilder $queryBuilder
  * @param ResourceFilter $filter
  * @param ForestCollection $collection
  * @param string $alias
  */
 public function filterQueryBuilder($queryBuilder, $filter, $collection, $alias)
 {
     if ($filter->hasSearch()) {
         $nested = $queryBuilder->expr()->orX();
         $searchValue = $queryBuilder->expr()->literal($filter->getSearch());
         foreach ($collection->getFields() as $field) {
             $fieldName = $alias . '.' . $field->getField();
             if ($fieldName == $alias . '.' . $collection->getIdentifier() || $field->getType() == 'String') {
                 $nested->add($queryBuilder->expr()->eq($fieldName, $searchValue));
             }
         }
         $queryBuilder->andWhere($nested);
     }
     if ($filter->hasFilters()) {
         foreach ($filter->getFilters() as $f) {
             /** @var DataFilter $f */
             $fieldName = $alias . '.' . $f->getFieldName();
             $filterValue = $queryBuilder->expr()->literal($f->getFilterString());
             if ($f->isDifferent()) {
                 $queryBuilder->andWhere($queryBuilder->expr()->neq($fieldName, $filterValue));
             } elseif ($f->isGreaterThan()) {
                 $queryBuilder->andWhere($queryBuilder->expr()->gt($fieldName, $filterValue));
             } elseif ($f->isLowerThan()) {
                 $queryBuilder->andWhere($queryBuilder->expr()->lt($fieldName, $filterValue));
             } elseif ($f->isContains() || $f->isStartsBy() || $f->isEndsBy()) {
                 $filterValue = $f->getFilterString();
                 if ($f->isContains() || $f->isStartsBy()) {
                     $filterValue = $filterValue . '%';
                 }
                 if ($f->isContains() || $f->isEndsBy()) {
                     $filterValue = '%' . $filterValue;
                 }
                 $filterValue = $queryBuilder->expr()->literal($filterValue);
                 $queryBuilder->andWhere($queryBuilder->expr()->like($fieldName, $filterValue));
             } elseif ($f->isPresent()) {
                 $queryBuilder->andWhere($queryBuilder->expr()->isNotNull($fieldName));
             } elseif ($f->isBlank()) {
                 $nested = $queryBuilder->expr()->orX($queryBuilder->expr()->isNull($fieldName), $queryBuilder->expr()->eq($fieldName, $queryBuilder->expr()->literal('')));
                 $queryBuilder->andWhere($nested);
             } else {
                 $queryBuilder->andWhere($queryBuilder->expr()->eq($fieldName, $filterValue));
             }
         }
     }
     if ($filter->hasSortBy()) {
         $queryBuilder->addOrderBy($alias . '.' . $filter->getSortBy(), $filter->getSortOrder());
     }
 }