Меню

Главная
Случайная статья
Настройки
Модуль:WDBackend
Материал из https://ru.wikipedia.org

Модуль предназначен для получения информации из Викиданных по задаваемой схеме. Схема описывается в формате таблицы Lua.

Модуль используется в модуле Модуль:CiteGost/WDSource для получения информации об источниках информации. Модуль WDSource, в свою очередь, используется в модуле Модуль:CiteGost для оформления библиографических записей.

Содержание

Использование

Создать экземпляр объекта форматирования можно функцией модуля new() с указанием языка получения данных. Для получения данных по схеме можно использовать методы полученного объекта:
  • fetchEntity(таблица, элемент, схема) — получить данных по схеме из указанного элемента Викиданных.
  • fetch(таблица, схема) — получить данных по схеме (элементы Викиданных уже указаны в схеме).
  • ensureLang() — ассерт на то, что язык точно выбран.


Формат схемы

Формат схемы в общем виде:
{
  -- Поле с указаным элементом Викиданных:
  {
    name = 'Имя поля с QID',
    -- Получить из элемента данные:
    get = {
      -- 1-е поле
      {
        name = 'Имя получаемого поля',

        property = 'P-идентификатор свойства',

        match = Значение, по которому будут обрабатываться квалификаторы (работает совместно с qualifiers),

        getValue = Опциональная функция получения значения (должна возвращать два аргумента: текст и язык текста),

        getData = Опциональная функция получения данных о значении (помимо значения, например, может возвращать его язык и флаг fromLabel получения данных из метки элемента),

        getLabel = Опциональный флаг получения метки элемента Викиданных по его идентификатору, заданному через параметр entity или уже присутствующему в таблице.

        max = Опциональное максимальное количество обрабатываемых значений,

        -- Подмена элементов Викиданных согласно отображению (ключ заменяется на значение):
        mapEntities = { QID 1 = 'QID 2', ... },

        -- Фильтрация по разрешённых элементам Викиданных:
        allowedEntities = { QID 1, QID 2, ... },

        defaultUnit = QID единицы измерения по умолчанию,

        -- Фильтрация по разрешённым единицам измерения:
        allowedUnits = { QID единицы измерения 1, QID единицы измерения 2, ... },

        -- Перезаписать поле, если у него уже задано значение:
        overwrite = true,

        -- Перезаписать идентификатор элемента Викиданных родительского поля (для безымянных полей):
        overwriteEntity = true,

        -- Перезаписать значение родительского поля (для безымянных полей):
        overwriteValue = true,

        -- Сделать поле вложенным полем для родительского (поместить в components):
        isLocal = true,

        -- Пометить значение как точное (например, как указано в источнике):
        exact = true,

        -- Принудительно делать из поля массив:
        isArray = true,

        -- Подставить значение текущего поля в другое по шаблону, заданному ещё одним полем:
        substInto = {
          name = 'Целевое поле (куда записываем)',
          template = {
            name = 'Имя поля, в значении которого записан шаблон',
          },
        }

        -- Получить другие поля из элемента Викиданных данного поля:
        get = {
          -- ...
        },

        -- Если текущее поле не удалось получить, то получить другие поля:
        elseGet = {
          -- ...
        },
      },
      -- ...
    },
  },
  -- ...
}


Общий формат отдельного поля:
{
  value = Значение (в случае даты  таблица)
  entity = Идентификатор элемента Викиданных
  unitEntity = Идентификатор элемента Викиданных единицы измерения, соответствующей значению value
  retrieved = Флаг, обозначающий, что поле было получено из Викиданных (а не заполнено вручную)
  exact = Флаг, обозначающий, что получено уточнённое значение поля
  lang = Язык, соответствующий значению
  components = {
    -- Вложенные поля
    -- ...
  },
}


Принцип работы

При обходе полей схемы, если в поле уже есть значение, то второй раз оно уже не будет получено, если только не указано overwrite=true, что подразумевает перезапись ранее заданного или полученного значения. Таким образом, можно в одно и то же поле пытаться получать значение по очереди из разных свойств. Получено будет первое попавшееся значение. По этому принципу (порядок получения) можно выстраивать приоритет получения данных из разных ствойств.

Если при обходе элементов значение очередного элемента было получено (ранее не было задано), то обходятся квалификаторы соответствующего элемента. В противном случае квалификаторы не обходятся. В случае неименованных аргументов квалификаторы обходятся всегда.

Если в поле не задано имя, то полученное значение никуда не записывается. Если же задан параметр overwriteEntity, перезаписывается идентификатор родительского элемента. Если задан параметр overwriteValue, — значение родительского элемента. Безымянные поля удобны для перезаписи значений родительских полей из квалификаторов, либо же для получения свойств из полученного в безымянном поле элемента через get.

Внесение изменений

При исправлении ошибки, пожалуйста, сначала добавьте тест, который будет проваливаться из-за обнаруженной ошибки, и только затем вносите исправление. При внесении исправления проверьте, чтобы все тесты проходили. Вносить исправление можно только, если оно не ломает другие тесты.

Добавление нового функционала рекомендуется делать у себя в песочнице, скопировав в неё модуль. В правке копирования необходимо указать тот факт, что делается копирование, и сделать ссылку на оригинальный модуль в виде викитекста. При добавлении нового функционала сначала желательно добавить тест на этот функционал, затем добавить сам функционал, убедившись, что все тесты при этом проходят.

Тесты

Все тесты пройдены.
Название Ожидается Фактически
test_fetchEntity_array
test_fetchEntity_baseTypes
test_fetchEntity_components
test_fetchEntity_defaultUnit
test_fetchEntity_elseGet_exists
test_fetchEntity_elseGet_in_inLocal_with_overwriteEntity
test_fetchEntity_elseGet_notExists
test_fetchEntity_forceGet
test_fetchEntity_forceGet_predefined_value
test_fetchEntity_get
test_fetchEntity_getValue
test_fetchEntity_has
test_fetchEntity_isArray
test_fetchEntity_isLocal_in_array
test_fetchEntity_isLocal_in_unnamed
test_fetchEntity_isLocal_with_qualifiers_and_get_by_entity_with_isLocal
test_fetchEntity_map
test_fetchEntity_max
test_fetchEntity_noOverwrite
test_fetchEntity_overwrite
test_fetchEntity_overwriteByQualifier
test_fetchEntity_overwriteEntity
test_fetchEntity_overwriteValue
test_fetchEntity_overwriteValueByQualifier
test_fetchEntity_qualifiers
test_fetchEntity_substInto





Разработка
  • Объединение полей из разных свойств (применимость под вопросов).
  • Автоматизированное получение маски URL (для избавления от параметра urlMaskProp в WDFormat).
  • Указание свойства, из которого были получены данные (необходимо для добавления к ссылке на Google Books номера страницы).
  • Поддержка загрузки из сторонних источников (например, заполняемых вручную таблиц) для отсутствующих в Викиданных свойств.
  • Перепродумать получение информации через указано как (P1932). У свойства не указывается язык и из-за этого не работает общая схема с выборкой по языкам на нижнем уровне. Как вариант не указывать язык и допускать выборку элементов, у которых язык не указан.
  • Параметр для получения названия статьи через mw.wikibase.getSitelink() в качестве эксперимента по получению всех данных в одном месте.
  • Внутренний автоматически формируемый кэш свойств, для которых данные получаются напрямую, чтобы при повторном получении указывалась лишь ссылка на уже существующую таблицу.
  • Тест на получение неизвестного значения с выполнением над ним пользовательской функции через getValue.
  • Сделать класс с метатаблицей для полей, чтобы можно было в упрощённом порядке обращаться к дочерним полям. Можно было бы переопределить оператор __call для доступа к дочерним полям, либо же переопределить __index и __newindex для доступа ко вложенной структуре дочерних полей, а __call использовать для доступа к параметрам value, entity и т. д. Второй вариант пока видится более удобным при обращении к элементам.
  • Параметр условия для получения значения поля в зависимости от наличия другого поля или наличия в нём определённого значения (depends).
  • Поддержка задания пути к полю в рамках иерархии (через фигурные скобки). Необходимо для записи вложенных в другие поля полей.
Downgrade Counter