/**
  * @internal
  * @param FilterInterface $filter
  * @param FilterParam\Searching[] $columnSearchs
  * @return CompositeExpression
  */
 private function getExpressionForColumnSearchs(FilterInterface $filter, array $columnSearchs)
 {
     $searchExprs = array();
     foreach ($columnSearchs as $col) {
         /* @var $col FilterParam\Searching */
         $field = $col->getColumnName();
         $searchs = $col->isTokenizable() ? $col->getTokens() : (array) $col->getValue();
         $searchColExprs = array();
         foreach ($searchs as $search) {
             $compExpr = $col->isExactly() ? Criteria::expr()->eq($field, $search) : Criteria::expr()->contains($field, $search);
             $column = $filter->getColumn($field);
             if ($column && count($subcols = $column->getSubColumns())) {
                 // with subcolumns
                 $searchSubColExprs = array();
                 $searchSubColExprs[] = $compExpr;
                 // self col ...
                 foreach ($subcols as $subcol) {
                     /* @var $subcol FilterParam\Column */
                     $subfield = $subcol->getName();
                     $compSubExpr = $col->isExactly() ? Criteria::expr()->eq($subfield, $search) : Criteria::expr()->contains($subfield, $search);
                     $searchSubColExprs[] = $compSubExpr;
                     // .. and his subcolumns
                 }
                 $searchColExprs[] = $this->createCompositeExpression(CompositeExpression::TYPE_OR, $searchSubColExprs);
             } else {
                 // no subcolumns
                 $searchColExprs[] = $compExpr;
             }
         }
         $searchExprs[] = $this->createCompositeExpression($col->getTokenSeparator(), $searchColExprs);
     }
     return $this->createCompositeExpression(CompositeExpression::TYPE_AND, $searchExprs);
 }