.. index:: выражения, фильтрация, вычисление значений .. _expressions: Выражения, фильтрация и вычисление значений =========================================== QGIS может выполнять разбор и анализ SQL-подобных выражений. Поддерживается ограниченное подмножество языка SQL. Выражения могут рассматриваться как логические предикаты (возвращающие True или False) или как функции (возвращающие скалярное значение). Поддерживается три основных типа данных: * число --- как целые, так и десятичные, например, ``123``, ``3.14`` * срока --- должна заключаться в одинарные кавычки: ``'hello world'`` * ссылка на столбец --- при вычислении ссылка заменяется на значение поля. Имена полей не экранируются. Доступны следующие операции: * арифметические операторы: ``+``, ``-``, ``*``, ``/``, ``^`` * скобки: для изменения приоритета операций: ``(1 + 1) * 3`` * унарный плюс и минус: ``-12``, ``+5`` * математические функции: ``sqrt``, ``sin``, ``cos``, ``tan``, ``asin``, ``acos``, ``atan`` * геометрические функции: ``$area``, ``$length`` * функции преобразования типа: ``to int``, ``to real``, ``to string`` Поддерживаются предикаты: * сравнение: ``=``, ``!=``, ``>``, ``>=``, ``<``, ``<=`` * соответствие образцу: ``LIKE`` (using % and _), ``~`` (регулярные выражения) * логические операторы: ``AND``, ``OR``, ``NOT`` * проверка на NULL: ``IS NULL``, ``IS NOT NULL`` **Примечание по совместимости:** математические и геометрические функции, функции преобразования типа и оператор возведения в степень ``^`` доступны начиная с QGIS 1.4. Примеры предикатов: * ``1 + 2 = 3`` * ``sin(angle) > 0`` * ``'Hello' LIKE 'He%'`` * ``(x > 10 AND y > 10) OR z = 0`` Примеры скалярных выражений: * ``2 ^ 10`` * ``sqrt(val)`` * ``$length + 1`` Разбор выражений ---------------- **TODO:** parsing, error handling :: >>> s = QgsSearchString() >>> s.setString("1 + 1 = 2") True >>> s.setString("1 + 1 =") False >>> s.parserErrorMsg() PyQt4.QtCore.QString(u'syntax error, unexpected $end') **TODO:** working with the tree, evaluation as a predicate, as a function, error handling .. index:: выражения; вычисление Вычисление выражений -------------------- :: st = ss.tree() if not st: raise ValueError, "empty expression was used" print st.makeSearchString() res = st.checkAgainst(fields, feature.attributeMap()) res, value = st.getValue(st, fields, feature.attributeMap(), feature.geometry()) print st.errorMsg()