Bitrix-D7  20.0.0
Класс ExpressionField
Граф наследования:ExpressionField:
Field IReadable UserTypeField

Открытые члены

 __construct ($name, $expression, $buildFrom=null, $parameters=array())
 All fields in exression should be placed as s (or as another placeholder for sprintf), and the real field names being carrying in $buildFrom array (= args for sprintf) Подробнее...
 
 __call ($name, $arguments)
 
 getTypeMask ()
 
 configureValueType ($class)
 
 setEntity (Entity $entity)
 
 getExpression ()
 
 getFullExpression ()
 
 isAggregated ()
 
 hasSubquery ()
 
 isConstant ()
 
 getBuildFromChains ()
 
 getDataType ()
 
 getValueType ()
 
 getValueField ()
 
 __clone ()
 
 cast ($value)
 
 convertValueFromDb ($value)
 
 convertValueToDb ($value)
 
 validateValue ($value, $primary, $row, Result $result)
 
- Открытые члены унаследованные от Field
 __construct ($name, $parameters=array())
 
 resetEntity ()
 
 modifyValueBeforeSave ($value, $data)
 
 getValidators ()
 
 addValidator ($validator)
 
 getFetchDataModifiers ()
 
 addFetchDataModifier ($modifier)
 
 getSaveDataModifiers ()
 
 addSaveDataModifier ($modifier)
 
 isSerialized ()
 
 setSerialized ()
 
 configureSerialized ()
 
 getName ()
 
 setName ($name)
 
 configureTitle ($title)
 Lang phrase. Подробнее...
 
 getTitle ()
 
 setParameter ($name, $value)
 
 getParameter ($name)
 
 hasParameter ($name)
 
 setParentField (Field $parentField)
 
 getParentField ()
 
 getEntity ()
 
 getLangCode ()
 
 getConnection ()
 
 serialize ($value)
 
 unserialize ($value)
 
 postInitialize ()
 Called after being initialized by Entity. Подробнее...
 

Открытые статические члены

static checkAggregation ($expression)
 
static checkSubquery ($expression)
 
static removeSubqueries ($expression)
 
- Открытые статические члены унаследованные от Field
static getOldDataTypeByClass ($class)
 
static getOldDataTypeByField (Field $field)
 
static getClassByOldDataType ($dateType)
 

Статические открытые данные

static $aggrFunctionsMSSQL
 
static $aggrFunctionsORACLE
 
static $aggrFunctions
 

Защищенные статические члены

static removeStrings ($quote, $expression)
 
static removeSubqueryBody ($query)
 

Защищенные данные

 $expression
 
 $fullExpression
 
 $valueType
 
 $valueField
 
 $buildFrom
 
 $buildFromChains
 
 $isAggregated
 
 $hasSubquery
 
- Защищенные данные унаследованные от Field
 $name
 
 $dataType
 
 $initialParameters
 
 $title
 
 $validation = null
 
 $validators = null
 
 $additionalValidators = array()
 
 $fetchDataModification = null
 
 $fetchDataModifiers
 
 $additionalFetchDataModifiers = array()
 
 $saveDataModification = null
 
 $saveDataModifiers
 
 $additionalSaveDataModifiers = array()
 
 $isSerialized = false
 
 $parentField
 
 $entity
 

Статические защищенные данные

static $aggrFunctionsMYSQL
 
- Статические защищенные данные унаследованные от Field
static $oldDataTypes
 

Дополнительные унаследованные члены

- Защищенные члены унаследованные от Field
 appendValidator ($validator)
 
 appendFetchDataModifier ($modifier)
 
 appendSaveDataModifier ($modifier)
 

Подробное описание

См. определение в файле expressionfield.php строка 23

Конструктор(ы)

◆ __construct()

__construct (   $name,
  $expression,
  $buildFrom = null,
  $parameters = array() 
)

All fields in exression should be placed as s (or as another placeholder for sprintf), and the real field names being carrying in $buildFrom array (= args for sprintf)

Аргументы
string$name
string$expression
array | string | null$buildFrom
array$parametersdeprecated, use configure* and add* instead
Исключения
SystemException

См. определение в файле expressionfield.php строка 90

91  {
92  if (!isset($parameters['data_type']))
93  {
94  $parameters['data_type'] = 'string'; // deprecated
95 
96  $this->valueType = StringField::class;
97  }
98 
99  parent::__construct($name, $parameters);
100 
101  $this->expression = $expression;
102 
103  if (!is_array($buildFrom) && $buildFrom !== null)
104  {
105  $buildFrom = array($buildFrom);
106  }
107  elseif ($buildFrom === null)
108  {
109  $buildFrom = array();
110  }
111 
112  $this->buildFrom = $buildFrom;
113  }

Методы

◆ __call()

__call (   $name,
  $arguments 
)

См. определение в файле expressionfield.php строка 115

116  {
117  return call_user_func_array(array($this->valueField, $name), $arguments);
118  }

◆ __clone()

__clone ( )

См. определение в файле expressionfield.php строка 397

398  {
399  $this->buildFromChains = null;
400  $this->fullExpression = null;
401  }

◆ cast()

cast (   $value)
Аргументы
mixed$value
Возвращает
mixed

Замещает IReadable.

Переопределяется в UserTypeField.

См. определение в файле expressionfield.php строка 408

409  {
411  return $valueField->cast($value);
412  }

◆ checkAggregation()

static checkAggregation (   $expression)
static

См. определение в файле expressionfield.php строка 271

272  {
273  if (empty(self::$aggrFunctions))
274  {
275  self::$aggrFunctions = array_unique(array_merge(
276  self::$aggrFunctionsMYSQL, self::$aggrFunctionsMSSQL, self::$aggrFunctionsORACLE
277  ));
278  }
279 
280  // should remove subqueries from expression here: EXISTS(..(..)..), (SELECT ..(..)..)
281  $expression = static::removeSubqueries($expression);
282 
283  // then check for aggr functions
284  preg_match_all('/(?:^|[^a-z0-9_])('.join('|', self::$aggrFunctions).')[\s\(]+/i', $expression, $matches);
285 
286  return isset($matches[1]) ? $matches[1] : null;
287  }

◆ checkSubquery()

static checkSubquery (   $expression)
static

См. определение в файле expressionfield.php строка 289

290  {
291  return (preg_match('/(?:^|[^a-zA-Z0-9_])EXISTS\s*\(/i', $expression) || preg_match('/(?:^|[^a-zA_Z0-9_])\(\s*SELECT/i', $expression));
292  }

◆ configureValueType()

configureValueType (   $class)
Аргументы
$class
Возвращает
$this

См. определение в файле expressionfield.php строка 133

134  {
135  $this->valueType = $class;
136  return $this;
137  }

◆ convertValueFromDb()

convertValueFromDb (   $value)
Аргументы
mixed$value
Возвращает
mixed

Замещает IReadable.

См. определение в файле expressionfield.php строка 419

420  {
422  return $valueField->convertValueFromDb($value);
423  }

◆ convertValueToDb()

convertValueToDb (   $value)
Аргументы
mixed$value
Возвращает
string

Замещает IReadable.

См. определение в файле expressionfield.php строка 430

431  {
432  /** @var IStorable $valueField */
434  return $valueField->convertValueToDb($value);
435  }

◆ getBuildFromChains()

getBuildFromChains ( )
Возвращает
array|\Bitrix\Main\ORM\Query\Chain[]
Исключения
SystemException

См. определение в файле expressionfield.php строка 242

243  {
244  if (is_null($this->buildFromChains))
245  {
246  $this->buildFromChains = array();
247 
248  foreach ($this->buildFrom as $elem)
249  {
250  // validate if build from scalar or expression
251  $chain = Chain::getChainByDefinition($this->entity, $elem);
252  $field = $chain->getLastElement()->getValue();
253 
254  if ($field instanceof ScalarField || $field instanceof ExpressionField)
255  {
256  $this->buildFromChains[] = $chain;
257  }
258  else
259  {
260  throw new SystemException(sprintf(
261  'Expected ScalarField or ExpressionField in `%s` build_from, but `%s` was given.',
262  $this->name, is_object($field) ? get_class($field).':'.$field->getName() : gettype($field)
263  ));
264  }
265  }
266  }
267 
268  return $this->buildFromChains;
269  }

◆ getDataType()

getDataType ( )
Уст.:
Возвращает
null|string

Переопределяет метод предка Field.

См. определение в файле expressionfield.php строка 376

377  {
378  return $this->valueField->getDataType();
379  }

◆ getExpression()

getExpression ( )

См. определение в файле expressionfield.php строка 171

172  {
173  return $this->expression;
174  }

◆ getFullExpression()

getFullExpression ( )
Возвращает
mixed|string
Исключения
SystemException

См. определение в файле expressionfield.php строка 180

181  {
182  if (!isset($this->fullExpression))
183  {
184  $SQLBuildFrom = array();
185 
186  foreach ($this->getBuildFromChains() as $chain)
187  {
188  if ($chain->getLastElement()->getValue() instanceof ExpressionField)
189  {
190  $SQLBuildFrom[] = $chain->getLastElement()->getValue()->getFullExpression();
191  }
192  else
193  {
194  $SQLBuildFrom[] = '%s';
195  }
196  }
197 
198  $this->fullExpression = call_user_func_array('sprintf', array_merge(array($this->expression), $SQLBuildFrom));
199  }
200 
201  return $this->fullExpression;
202  }

◆ getTypeMask()

getTypeMask ( )
Возвращает
mixed

Переопределяет метод предка Field.

Переопределяется в UserTypeField.

См. определение в файле expressionfield.php строка 123

124  {
126  }

◆ getValueField()

getValueField ( )
Возвращает
ScalarField

См. определение в файле expressionfield.php строка 392

393  {
394  return $this->valueField;
395  }

◆ getValueType()

getValueType ( )
Возвращает
string

См. определение в файле expressionfield.php строка 384

385  {
386  return $this->valueType;
387  }

◆ hasSubquery()

hasSubquery ( )
Возвращает
bool
Исключения
SystemException

См. определение в файле expressionfield.php строка 222

223  {
224  if (!isset($this->hasSubquery))
225  {
226  $this->hasSubquery = (bool) self::checkSubquery($this->getFullExpression());
227  }
228 
229  return $this->hasSubquery;
230  }

◆ isAggregated()

isAggregated ( )
Возвращает
bool
Исключения
SystemException

См. определение в файле expressionfield.php строка 208

209  {
210  if (!isset($this->isAggregated))
211  {
212  $this->isAggregated = (bool) self::checkAggregation($this->getFullExpression());
213  }
214 
215  return $this->isAggregated;
216  }

◆ isConstant()

isConstant ( )

См. определение в файле expressionfield.php строка 232

233  {
234  return empty($this->buildFrom);
235  }

◆ removeStrings()

static removeStrings (   $quote,
  $expression 
)
staticprotected

См. определение в файле expressionfield.php строка 315

316  {
317  // remove escaped quotes
318  $expression = str_replace('\\' . $quote, '', $expression);
319 
320  // remove quoted strings
321  $expression = preg_replace('/' . $quote . '.*?' . $quote . '/', '', $expression);
322 
323  return $expression;
324  }

◆ removeSubqueries()

static removeSubqueries (   $expression)
static

См. определение в файле expressionfield.php строка 294

295  {
296  // remove double slashes
297  $expression = str_replace('\\\\\\\\', '', $expression);
298 
299  // remove strings
300  $expression = static::removeStrings('"', $expression);
301  $expression = static::removeStrings("'", $expression);
302 
303  // remove subqueries' bodies
304  $clear = static::removeSubqueryBody($expression);
305 
306  while ($clear !== $expression)
307  {
308  $expression = $clear;
309  $clear = static::removeSubqueryBody($expression);
310  }
311 
312  return $clear;
313  }

◆ removeSubqueryBody()

static removeSubqueryBody (   $query)
staticprotected

См. определение в файле expressionfield.php строка 326

327  {
328  $subqPattern = '\(\s*SELECT\s+';
329 
330  $matches = null;
331  preg_match('/' . $subqPattern . '/i', $query, $matches);
332 
333  if (!empty($matches))
334  {
335  $substring = $matches[0];
336 
337  $subqPosition = strpos($query, $substring);
338  $subqStartPosition = $subqPosition + strlen($substring);
339 
340  $bracketsCount = 1;
341  $currentPosition = $subqStartPosition;
342 
343  // until initial bracket is closed
344  while ($bracketsCount > 0)
345  {
346  $symbol = substr($query, $currentPosition, 1);
347 
348  if ($symbol == '')
349  {
350  // end of string
351  break;
352  }
353 
354  if ($symbol == '(')
355  {
356  $bracketsCount++;
357  }
358  elseif ($symbol == ')')
359  {
360  $bracketsCount--;
361  }
362 
363  $currentPosition++;
364  }
365 
366  $query = substr($query, 0, $subqPosition) . substr($query, $currentPosition);
367  }
368 
369  return $query;
370  }

◆ setEntity()

setEntity ( Entity  $entity)
Аргументы
Entity$entity
Исключения
SystemException

Переопределяет метод предка Field.

См. определение в файле expressionfield.php строка 145

146  {
147  parent::setEntity($entity);
148 
149  if ($this->valueType !== null)
150  {
151  /** @var ScalarField $valueField */
152  $valueField = new $this->valueType($this->name);
153  $this->valueField = $this->entity->initializeField($this->name, $valueField);
154  }
155  else
156  {
157  // deprecated - old format with parameters and data_type
158  $parameters = $this->initialParameters;
159 
160  unset($parameters['expression']);
161  $this->valueField = $this->entity->initializeField($this->name, $parameters);
162  $this->valueType = get_class($this->valueField);
163  }
164 
165  if (!($this->valueField instanceof ScalarField))
166  {
167  throw new SystemException('expression field can only be a scalar type.');
168  }
169  }

◆ validateValue()

validateValue (   $value,
  $primary,
  $row,
Result  $result 
)

Переопределяет метод предка Field.

См. определение в файле expressionfield.php строка 437

438  {
439  throw new NotImplementedException;
440  }

Поля

◆ $aggrFunctions

$aggrFunctions
static

См. определение в файле expressionfield.php строка 77

◆ $aggrFunctionsMSSQL

$aggrFunctionsMSSQL
static
Инициализатор
= array('AVG', 'MIN', 'CHECKSUM_AGG', 'OVER', 'COUNT',
'ROWCOUNT_BIG', 'COUNT_BIG', 'STDEV', 'GROUPING', 'STDEVP',
'GROUPING_ID', 'SUM', 'MAX', 'VAR', 'VARP'
)

См. определение в файле expressionfield.php строка 61

◆ $aggrFunctionsMYSQL

$aggrFunctionsMYSQL
staticprotected
Инициализатор
= array('AVG', 'BIT_AND', 'BIT_OR', 'BIT_XOR', 'COUNT',
'GROUP_CONCAT', 'MAX', 'MIN', 'STD', 'STDDEV_POP', 'STDDEV_SAMP',
'STDDEV', 'SUM', 'VAR_POP', 'VAR_SAMP', 'VARIANCE'
)

См. определение в файле expressionfield.php строка 57

◆ $aggrFunctionsORACLE

$aggrFunctionsORACLE
static
Инициализатор
= array('AVG', 'COLLECT', 'CORR', 'CORR_S', 'CORR_K',
'COUNT', 'COVAR_POP', 'COVAR_SAMP', 'CUME_DIST', 'DENSE_RANK', 'FIRST',
'GROUP_ID', 'GROUPING', 'GROUPING_ID', 'LAST', 'MAX', 'MEDIAN', 'MIN',
'PERCENTILE_CONT', 'PERCENTILE_DISC', 'PERCENT_RANK', 'RANK',
'REGR_SLOPE', 'REGR_INTERCEPT', 'REGR_COUNT', 'REGR_R2', 'REGR_AVGX',
'REGR_AVGY', 'REGR_SXX', 'REGR_SYY', 'REGR_SXY', 'STATS_BINOMIAL_TEST',
'STATS_CROSSTAB', 'STATS_F_TEST', 'STATS_KS_TEST', 'STATS_MODE',
'STATS_MW_TEST', 'STATS_ONE_WAY_ANOVA', 'STATS_T_TEST_ONE',
'STATS_T_TEST_PAIRED', 'STATS_T_TEST_INDEP', 'STATS_T_TEST_INDEPU',
'STATS_WSR_TEST', 'STDDEV', 'STDDEV_POP', 'STDDEV_SAMP', 'SUM',
'VAR_POP', 'VAR_SAMP', 'VARIANCE'
)

См. определение в файле expressionfield.php строка 65

◆ $buildFrom

$buildFrom
protected

См. определение в файле expressionfield.php строка 47

◆ $buildFromChains

$buildFromChains
protected

См. определение в файле expressionfield.php строка 50

◆ $expression

$expression
protected

См. определение в файле expressionfield.php строка 28

◆ $fullExpression

$fullExpression
protected

См. определение в файле expressionfield.php строка 34

◆ $hasSubquery

$hasSubquery
protected

См. определение в файле expressionfield.php строка 54

◆ $isAggregated

$isAggregated
protected

См. определение в файле expressionfield.php строка 52

◆ $valueField

$valueField
protected

См. определение в файле expressionfield.php строка 42

◆ $valueType

$valueType
protected

См. определение в файле expressionfield.php строка 37


Объявления и описания членов класса находятся в файле:
Bitrix\Main\ORM\Fields\Field\$name
$name
Definition: main/lib/orm/fields/field.php:27
Bitrix\Main\ORM\Query\Chain\getChainByDefinition
static getChainByDefinition(Entity $init_entity, $definition)
Definition: main/lib/orm/query/chain.php:208
Bitrix\Main\ORM\Fields\ExpressionField\getFullExpression
getFullExpression()
Definition: expressionfield.php:180
Bitrix\Main\ORM\Fields\ExpressionField\isAggregated
isAggregated()
Definition: expressionfield.php:208
Bitrix\Main\ORM\Fields\ExpressionField\$valueType
$valueType
Definition: expressionfield.php:37
Bitrix\Main\ORM\Fields\ExpressionField\hasSubquery
hasSubquery()
Definition: expressionfield.php:222
Bitrix\Main\ORM\Fields\ExpressionField\$buildFrom
$buildFrom
Definition: expressionfield.php:47
Bitrix\Main\ORM\Fields\FieldTypeMask\EXPRESSION
const EXPRESSION
Definition: fieldtypemask.php:18
Bitrix\Main\ORM\Fields\ExpressionField\$buildFromChains
$buildFromChains
Definition: expressionfield.php:50
Bitrix\Main\ORM\Fields\ExpressionField\getBuildFromChains
getBuildFromChains()
Definition: expressionfield.php:242
Bitrix\Main\ORM\Fields\ExpressionField\$expression
$expression
Definition: expressionfield.php:28
Bitrix\Main\ORM\Fields\ExpressionField\$fullExpression
$fullExpression
Definition: expressionfield.php:34
Bitrix\Sender\Connector\__construct
__construct(Base $connector)
Constructor.
Definition: resultview.php:40
Bitrix\Main\ORM\Fields\ExpressionField\$isAggregated
$isAggregated
Definition: expressionfield.php:52
Bitrix\Main\ORM\Fields\ExpressionField\$valueField
$valueField
Definition: expressionfield.php:42
Bitrix\Main\ORM\Fields\Field\$entity
$entity
Definition: main/lib/orm/fields/field.php:76
Bitrix\Main\ORM\Fields\ExpressionField\$hasSubquery
$hasSubquery
Definition: expressionfield.php:54
Bitrix\Main\ORM\Fields\Field\$initialParameters
$initialParameters
Definition: main/lib/orm/fields/field.php:33