@ -74,19 +74,24 @@ class Query extends Component implements QueryInterface
*
* [ свойство => е г о значение ]
*/
public array | string $search ;
public array $search ;
/**
* Фильтр
* Тип поиска
*/
public string $searchType = 'START' ;
/**
* Поиск
*
* [ свойство => е г о значение ]
*/
public array | string $filter ;
public array $filter ;
/**
* Отлад ка
* Тип поис ка
*/
public bool $debug = false ;
public string $filterType = 'START' ;
public $orderBy ;
@ -152,11 +157,6 @@ class Query extends Component implements QueryInterface
]
);
if ( $this -> debug ) {
var_dump ( $aql );
die ;
}
return $this -> getStatement ( $options , $db );
}
@ -233,18 +233,20 @@ class Query extends Component implements QueryInterface
/**
*/
public function search ( array | string $expressions ) : self
public function search ( array $text , string $type = 'START' ) : self
{
$this -> search = $expressions ;
$this -> search = $text ;
$this -> searchType = $type ;
return $this ;
}
/**
*/
public function filter ( array | string $expressions ) : self
public function filter ( array $text , string $type = 'START' ) : self
{
$this -> filter = $expressions ;
$this -> filter = $text ;
$this -> filterType = $type ;
return $this ;
}
@ -785,13 +787,8 @@ class Query extends Component implements QueryInterface
return '' ;
}
$orders = [];
foreach ( $columns as $name => $direction ) {
$orders [] = $this -> quoteColumnName ( $name ) . match ( $direction ) {
SORT_DESC => ' DESC' ,
SORT_ASC => ' ASC' ,
default => ''
};
$orders [] = $this -> quoteColumnName ( $name ) . ( $direction === SORT_DESC ? ' DESC' : '' );
}
return 'SORT ' . implode ( ', ' , $orders );
@ -870,9 +867,9 @@ class Query extends Component implements QueryInterface
$query :: genIn ( $query -> in , $query -> traversals ),
$query :: genLet ( $query -> lets ),
$query -> genForeach ( $query -> foreach ),
isset ( $query -> search ) ? $query -> genSearch ( $query -> search ) : null ,
isset ( $query -> filter ) ? $query -> genFilter ( $query -> filter ) : null ,
$query -> genWhere ( $query -> where , $params ),
isset ( $query -> search ) ? $query -> genSearch ( $query -> search , $query -> searchType ) : null ,
isset ( $query -> filter ) ? $query -> genFilter ( $query -> filter , $query -> filterType ) : null ,
$query -> genOrderBy ( $query -> orderBy , $params ),
$query -> genLimit ( $query -> limit , $query -> offset , $params ),
$query -> genSelect ( $query -> select , $params ),
@ -880,11 +877,6 @@ class Query extends Component implements QueryInterface
$aql = implode ( $query -> separator , array_filter ( $clauses ));
if ( $query -> debug ) {
var_dump ( $aql );
die ;
}
return self :: prepareBindVars ( $aql , $params );
}
@ -945,7 +937,6 @@ class Query extends Component implements QueryInterface
$statement = $this -> createCommand ( $db );
$token = $this -> getRawAql ( $statement );
Yii :: info ( $token , 'mirzaev\yii2\arangodb\Query::query' );
@ -1137,31 +1128,16 @@ class Query extends Component implements QueryInterface
* @ param $columns
* @ return string
*/
protected function genSearch ( array | string $expression s) : string
protected function genSearch ( array $expression , string $type = 'START' ) : string
{
if ( is_string ( $expressions )) return $expressions ;
// Инициализация строки запроса
$query = 'SEARCH ' ;
foreach ( $expressions as $expression ) {
// Перебор выражений
// Инициализация оператора
$operator = isset ( $expression [ 'operator' ]) ? ' ' . $expression [ 'operator' ] . ' ' : '' ;
// Генерация строки запроса
$query .= match ( strtoupper ( $expression [ 'type' ])) {
'START' , 'STARTS' , 'STARTS_WITH' => $operator . $this -> filterStartsWith ( $expression [ 'condition' ]),
'START_SENSETIVE' => $operator . $this -> filterStartsWith ( $expression [ 'condition' ], sensetive : true ),
'CONTAINS' , 'LIKE' => $operator . $this -> filterContains ( $expression [ 'condition' ]),
'LEVENSHTEIN' => $operator . $this -> filterLevenshtein ( $expression [ 'condition' ], ... $expression [ 'parameters' ]),
'PHRASE' => $operator . $this -> filterPhrase ( $expression [ 'condition' ], ... $expression [ 'parameters' ]),
default => $operator . Serializer :: encode ( $expression [ 'condition' ])
};
}
return $query ;
return match ( strtoupper ( $type )) {
'START' , 'STARTS' , 'STARTS_WITH' => $query . $this -> filterStartsWith ( $expression ),
'START_SENSETIVE' => $query . $this -> filterStartsWith ( $expression , sensetive : true ),
'CONTAINS' , 'LIKE' => $query . $this -> filterContains ( $expression ),
default => $query . Serializer :: encode ( $expression )
};
}
/**
@ -1169,31 +1145,16 @@ class Query extends Component implements QueryInterface
* @ param $columns
* @ return string
*/
protected function genFilter ( array | string $expression s) : string
protected function genFilter ( array $expression , string $type = 'START' ) : string
{
if ( isString ( $expressions )) return $expressions ;
// Инициализация строки запроса
$query = 'FILTER ' ;
foreach ( $expressions as $expression ) {
// Перебор выражений
// Инициализация оператора
$operator = isset ( $expression [ 'operator' ]) ? ' ' . $expression [ 'operator' ] . ' ' : '' ;
// Генерация строки запроса
$query .= match ( strtoupper ( $expression [ 'type' ])) {
'START' , 'STARTS' , 'STARTS_WITH' => $operator . $this -> filterStartsWith ( $expression [ 'condition' ]),
'START_SENSETIVE' => $operator . $this -> filterStartsWith ( $expression [ 'condition' ], sensetive : true ),
'CONTAINS' , 'LIKE' => $operator . $this -> filterContains ( $expression [ 'condition' ]),
'LEVENSHTEIN' => $operator . $this -> filterLevenshtein ( $expression [ 'condition' ], ... $expression [ 'parameters' ]),
'PHRASE' => $operator . $this -> filterPhrase ( $expression [ 'condition' ], ... $expression [ 'parameters' ]),
default => $operator . Serializer :: encode ( $expression [ 'condition' ])
};
}
return $query ;
return match ( strtoupper ( $type )) {
'START' , 'STARTS' , 'STARTS_WITH' => $query . $this -> filterStartsWith ( $expression ),
'START_SENSETIVE' => $query . $this -> filterStartsWith ( $expression , sensetive : true ),
'CONTAINS' , 'LIKE' => $query . $this -> filterContains ( $expression ),
default => $query . Serializer :: encode ( $expression )
};
}
/**
@ -1396,17 +1357,6 @@ class Query extends Component implements QueryInterface
return $this ;
}
/**
* @ param array $expression
*/
public function debug ( bool $status = true )
{
$this -> debug = $status ;
return $this ;
}
/**
*/
public function let ( string $name , mixed $value ) : static
@ -1533,44 +1483,6 @@ class Query extends Component implements QueryInterface
return $return ;
}
public function filterPhrase ( array $expression , string $analyzer = 'text_en' ) : string
{
// Инициализация
$return = [];
foreach ( $expression as $key => $value ) {
// Перебор выражений
if ( $return ) {
$return .= ' OR PHRASE(' . $this -> quoteCollectionName ( $this -> collection ) . " . $key , \" $value\ " , \ " $analyzer\ " ) " ;
} else {
$return = 'PHRASE(' . $this -> quoteCollectionName ( $this -> collection ) . " . $key , \" $value\ " , \ " $analyzer\ " ) " ;
}
}
return $return ;
}
public function filterLevenshtein ( array $expression , string $analyzer = 'text_en' , int $distance = 3 , bool $transpositions = true ) : string
{
// Инициализация
$return = [];
$transpositions = $transpositions ? 'true' : 'false' ;
foreach ( $expression as $key => $value ) {
// Перебор выражений
if ( $return ) {
$return .= ' OR ANALYZER(LEVENSHTEIN_MATCH(' . $this -> quoteCollectionName ( $this -> collection ) . " . $key , \" $value\ " , $distance , $transpositions ), \ " $analyzer\ " ) " ;
} else {
$return = 'ANALYZER(LEVENSHTEIN_MATCH(' . $this -> quoteCollectionName ( $this -> collection ) . " . $key , \" $value\ " , $distance , $transpositions ), \ " $analyzer\ " ) " ;
}
}
return $return ;
}
/**
* Adds an additional WHERE condition to the existing one but ignores [[ isEmpty () | empty operands ]] .
* The new condition and the existing one will be joined using the 'AND' operator .
@ -1768,7 +1680,6 @@ class Query extends Component implements QueryInterface
$result [ $column ] = SORT_ASC ;
}
}
return $result ;
}
}