<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://belgen.info/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidataSelectors</id>
	<title>Модуль:WikidataSelectors - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://belgen.info/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidataSelectors"/>
	<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;action=history"/>
	<updated>2026-04-25T19:03:59Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=370&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=370&amp;oldid=prev"/>
		<updated>2022-12-19T23:45:54Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 23:45, 19 декабря 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=186&amp;oldid=prev</id>
		<title>178.237.223.247: Новая страница: «local i18n = {     [&quot;errors&quot;] = {         [&quot;rank-not-valid&quot;] = &quot;Некорретное значение приоритета (rank)&quot;,         [&quot;cant-parse-condition&quot;] = &quot;Не удалось разобрать условие&quot;     } }  local validRanks = { 	'best', 	'preferred', 	'normal', 	'deprecated' }   --    Internal function for error message     Input: key in errors table   Output: error message  local function throwError( key )     error( i18n.erro...»</title>
		<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=186&amp;oldid=prev"/>
		<updated>2022-12-19T22:46:15Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local i18n = {     [&amp;quot;errors&amp;quot;] = {         [&amp;quot;rank-not-valid&amp;quot;] = &amp;quot;Некорретное значение приоритета (rank)&amp;quot;,         [&amp;quot;cant-parse-condition&amp;quot;] = &amp;quot;Не удалось разобрать условие&amp;quot;     } }  local validRanks = { 	&amp;#039;best&amp;#039;, 	&amp;#039;preferred&amp;#039;, 	&amp;#039;normal&amp;#039;, 	&amp;#039;deprecated&amp;#039; }   --&lt;a href=&quot;/wiki/index.php?title=Internal_function_for_error_message_Input:_key_in_errors_table_Output:_error_message&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Internal function for error message Input: key in errors table Output: error message (страница не существует)&quot;&gt;Internal function for error message     Input: key in errors table   Output: error message &lt;/a&gt; local function throwError( key )     error( i18n.erro...»&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 22:46, 19 декабря 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>178.237.223.247</name></author>
	</entry>
	<entry>
		<id>https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=369&amp;oldid=prev</id>
		<title>wiki&gt;Putnik: в таком виде не улучшает ситуацию</title>
		<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataSelectors&amp;diff=369&amp;oldid=prev"/>
		<updated>2021-11-29T11:08:29Z</updated>

		<summary type="html">&lt;p&gt;в таком виде не улучшает ситуацию&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local i18n = {&lt;br /&gt;
    [&amp;quot;errors&amp;quot;] = {&lt;br /&gt;
        [&amp;quot;rank-not-valid&amp;quot;] = &amp;quot;Некорретное значение приоритета (rank)&amp;quot;,&lt;br /&gt;
        [&amp;quot;cant-parse-condition&amp;quot;] = &amp;quot;Не удалось разобрать условие&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local validRanks = {&lt;br /&gt;
	'best',&lt;br /&gt;
	'preferred',&lt;br /&gt;
	'normal',&lt;br /&gt;
	'deprecated'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
  Internal function for error message&lt;br /&gt;
 &lt;br /&gt;
  Input: key in errors table&lt;br /&gt;
  Output: error message&lt;br /&gt;
]]&lt;br /&gt;
local function throwError( key )&lt;br /&gt;
    error( i18n.errors[key] )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
  Main function for parse selectors and filter statements&lt;br /&gt;
 &lt;br /&gt;
  Input: statements table, selector string&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filter( allClaims, propertySelector )&lt;br /&gt;
	propertySelector = mw.text.trim( propertySelector )&lt;br /&gt;
&lt;br /&gt;
	-- Get property ID from selector&lt;br /&gt;
	local propertyId = mw.ustring.match( propertySelector, '^[Pp]%d+' )&lt;br /&gt;
	if not propertyId then&lt;br /&gt;
		propertyId = ''&lt;br /&gt;
	end&lt;br /&gt;
	local initPos = #propertyId + 1&lt;br /&gt;
	propertyId = string.upper( propertyId )&lt;br /&gt;
    if ( not allClaims ) then&lt;br /&gt;
    	return nil&lt;br /&gt;
    end&lt;br /&gt;
	local allPropertyClaims = allClaims[propertyId]&lt;br /&gt;
    if ( not allPropertyClaims ) then&lt;br /&gt;
    	return nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	-- Gathering rules&lt;br /&gt;
	local rules = p.matchSelectors( propertySelector, initPos )&lt;br /&gt;
&lt;br /&gt;
	-- If there is no rank filter, than default rank is 'best'&lt;br /&gt;
	local isRanked = false&lt;br /&gt;
	for i, subRules in ipairs( rules ) do&lt;br /&gt;
		for j, rule in ipairs( subRules ) do&lt;br /&gt;
			if rule['type'] == 'rank' then&lt;br /&gt;
				isRanked = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not isRanked then&lt;br /&gt;
		table.insert( rules, 1, { { type = 'rank', value = 'best' } } )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Execute rules&lt;br /&gt;
	allPropertyClaims = p.applyRules( allPropertyClaims, rules )&lt;br /&gt;
&lt;br /&gt;
	return allPropertyClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Match and gather selector rules&lt;br /&gt;
 &lt;br /&gt;
  Input: string with selectors rules, start position&lt;br /&gt;
  Output: rules table&lt;br /&gt;
]]&lt;br /&gt;
function p.matchSelectors( selectorsString, initPos )&lt;br /&gt;
	local rules = {}&lt;br /&gt;
	local rawRulePattern = '^%s*%[%s*[^%[%]]+%s*%]%s*'&lt;br /&gt;
	local rulePattern = '^%s*%[%s*([^%[%]]+)%s*%]%s*$'&lt;br /&gt;
	&lt;br /&gt;
	if not initPos then&lt;br /&gt;
		initPos = 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rawRule = mw.ustring.match( selectorsString, rawRulePattern, initPos )&lt;br /&gt;
&lt;br /&gt;
	while rawRule do&lt;br /&gt;
		initPos = initPos + #rawRule&lt;br /&gt;
		rule = mw.ustring.match( rawRule, rulePattern )&lt;br /&gt;
		rule = mw.text.trim( rule )&lt;br /&gt;
&lt;br /&gt;
		local subRules = mw.text.split( rule, '%s*,%s*' )&lt;br /&gt;
		local commands = {}&lt;br /&gt;
		local comm&lt;br /&gt;
&lt;br /&gt;
		for i, subRule in ipairs( subRules ) do&lt;br /&gt;
			local isInversed = false&lt;br /&gt;
			if mw.ustring.match( subRule, '^!' ) then&lt;br /&gt;
				isInversed = true&lt;br /&gt;
				subRule = mw.ustring.match( subRule, '^!%s*(.+)$' )&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- p123[1]&lt;br /&gt;
			if mw.ustring.match( subRule, '^%d+$' ) then&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'position',&lt;br /&gt;
					value = subRule,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
	&lt;br /&gt;
			-- p123[rank:preferred]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^rank%s*:%s*(%a+)$' ) then&lt;br /&gt;
				rank = mw.ustring.match( subRule, '^rank%s*:%s*(%a+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'rank',&lt;br /&gt;
					value = rank,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[language:xx]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^language%s*:%s*([%a%-]+)$' ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, '^language%s*:%s*([%a%-]+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'language',&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[language!:xx]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^language%s*!:%s*([%a%-]+)$' ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, '^language%s*!:%s*([%a%-]+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'language',&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = not isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[unit:q789]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^unit%s*:%s*[^%[%],:]+$' ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, ':%s*([^%[%],:]+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'unit',&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[unit!:q789]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^unit%s*!:%s*[^%[%],:]+$' ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, '!:%s*([^%[%],:]+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'unit',&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = not isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[p456]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^[Pp]%d+$' ) then&lt;br /&gt;
				qualifier = mw.ustring.match( subRule, '^[Pp]%d+' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'qualifier',&lt;br /&gt;
					qualifier = qualifier,&lt;br /&gt;
					value = nil,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[p456:q789]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^[Pp]%d+%s*:%s*[^%[%],:]+$' ) then&lt;br /&gt;
				qualifier = mw.ustring.match( subRule, '^([Pp]%d+)%s*:?' )&lt;br /&gt;
				value = mw.ustring.match( subRule, ':%s*([^%[%],:]+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'qualifier',&lt;br /&gt;
					qualifier = qualifier,&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[p456!:q789]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^[Pp]%d+%s*!:%s*[^%[%],:]+$' ) then&lt;br /&gt;
				qualifier = mw.ustring.match( subRule, '^([Pp]%d+)%s*!:?' )&lt;br /&gt;
				value = mw.ustring.match( subRule, '!:%s*([^%[%],:]+)$' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'qualifier',&lt;br /&gt;
					qualifier = qualifier,&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = not isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			-- p123[q456]&lt;br /&gt;
			elseif mw.ustring.match( subRule, '^[Qq]%d+$' ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, '^[Qq]%d+' )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = 'value',&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
				throwError( 'cant-parse-condition' )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #commands then&lt;br /&gt;
			table.insert( rules, commands )&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		rawRule = mw.ustring.match( selectorsString, rawRulePattern, initPos )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return rules&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Intercept statements with selector rules&lt;br /&gt;
 &lt;br /&gt;
  Input: statements table, selector rules&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.applyRules( claims, rules )&lt;br /&gt;
	for i, subRules in ipairs( rules ) do&lt;br /&gt;
		local newClaims = {}&lt;br /&gt;
		for j, rule in ipairs( subRules ) do&lt;br /&gt;
			if rule['type'] == 'rank' then&lt;br /&gt;
				table.insert( newClaims, p.filterByRank( claims, rule['value'], rule['inversed'] ) )&lt;br /&gt;
			elseif rule['type'] == 'language' then&lt;br /&gt;
				table.insert( newClaims, p.filterByLanguage( claims, rule['value'], rule['inversed'] ) )&lt;br /&gt;
			elseif rule['type'] == 'unit' then&lt;br /&gt;
				table.insert( newClaims, p.filterByUnit( claims, rule['value'], rule['inversed'] ) )&lt;br /&gt;
			elseif rule['type'] == 'position' then&lt;br /&gt;
				table.insert( newClaims, p.filterByPosition( claims, rule['value'], rule['inversed'] ) )&lt;br /&gt;
			elseif rule['type'] == 'qualifier' then&lt;br /&gt;
				table.insert( newClaims, p.filterByQualifier( claims, rule['qualifier'], rule['value'], rule['inversed'] ) )&lt;br /&gt;
			elseif rule['type'] == 'value' then&lt;br /&gt;
				table.insert( newClaims, p.filterByValue( claims, rule['value'], rule['inversed'] ) )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		claims = {}&lt;br /&gt;
&lt;br /&gt;
		--[[&lt;br /&gt;
			Merge all claims&lt;br /&gt;
			TODO: It's not good&lt;br /&gt;
		]]&lt;br /&gt;
		for j, newSubClaims in ipairs( newClaims ) do&lt;br /&gt;
			for k, newClaim in ipairs( newSubClaims ) do&lt;br /&gt;
				local isNew = true&lt;br /&gt;
				for l, oldClaim in ipairs( claims ) do&lt;br /&gt;
					if oldClaim['id'] == newClaim['id'] then&lt;br /&gt;
						isNew = false&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if isNew then&lt;br /&gt;
					table.insert( claims, newClaim )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Filter statements by rank&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, rank value, inversion&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filterByRank( claims, rank, inversed )&lt;br /&gt;
	if not inversed then&lt;br /&gt;
		inversed = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not rank then&lt;br /&gt;
		rank = 'best'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Check if rank value is valid&lt;br /&gt;
	local isValidRank = false&lt;br /&gt;
	for i, validRank in ipairs( validRanks ) do&lt;br /&gt;
		if rank == validRank then&lt;br /&gt;
			isValidRank = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not isValidRank then&lt;br /&gt;
		throwError( 'rank-not-valid' )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the best rank&lt;br /&gt;
	if rank == 'best' then&lt;br /&gt;
		rank = 'normal' -- default rank (don't use deprecated even if it's no more claims)&lt;br /&gt;
&lt;br /&gt;
		-- If we have at least one preferred rank, mark it as best&lt;br /&gt;
		for i, statement in pairs( claims ) do&lt;br /&gt;
			if (statement.rank == 'preferred') then&lt;br /&gt;
				rank = 'preferred'&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local resultClaims = {};&lt;br /&gt;
	for i, statement in pairs( claims ) do&lt;br /&gt;
		if ( statement.rank == rank ) ~= inversed then&lt;br /&gt;
			table.insert( resultClaims, statement )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Filter statements by language of value&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, language, inversion&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filterByLanguage( claims, language, inversed )&lt;br /&gt;
	if not inversed then&lt;br /&gt;
		inversed = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local resultClaims = {}&lt;br /&gt;
	local mulStatement = {}&lt;br /&gt;
	for i, statement in ipairs( claims ) do&lt;br /&gt;
		isMatchLanguage = false&lt;br /&gt;
		if statement['mainsnak']&lt;br /&gt;
				and statement['mainsnak']['datavalue']&lt;br /&gt;
				and statement['mainsnak']['datavalue']['value']&lt;br /&gt;
				and statement['mainsnak']['datavalue']['value']['language'] then&lt;br /&gt;
				&lt;br /&gt;
			if statement['mainsnak']['datavalue']['value']['language'] == language then&lt;br /&gt;
				isMatchLanguage = true&lt;br /&gt;
			end&lt;br /&gt;
			if statement['mainsnak']['datavalue']['value']['language'] == 'mul' then&lt;br /&gt;
				mulStatement = statement&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if isMatchLanguage ~= inversed then&lt;br /&gt;
			table.insert( resultClaims, statement )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if next(resultClaims) == nil and next(mulStatement) ~= nil then&lt;br /&gt;
		-- if specific language is not found, but there is Q20923490 value&lt;br /&gt;
		table.insert( resultClaims, mulStatement )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Filter statements by unit of value&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, unit, inversion&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filterByUnit( claims, unit, inversed )&lt;br /&gt;
	if not inversed then&lt;br /&gt;
		inversed = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	unit = 'http://www.wikidata.org/entity/' .. string.upper( unit )&lt;br /&gt;
&lt;br /&gt;
	local resultClaims = {}&lt;br /&gt;
	for i, statement in ipairs( claims ) do&lt;br /&gt;
		isMatchUnit = false&lt;br /&gt;
		mw.log(statement['mainsnak']['datavalue']['value']['unit'])&lt;br /&gt;
		if statement['mainsnak']&lt;br /&gt;
				and statement['mainsnak']['datavalue']&lt;br /&gt;
				and statement['mainsnak']['datavalue']['value']&lt;br /&gt;
				and statement['mainsnak']['datavalue']['value']['unit']&lt;br /&gt;
				and statement['mainsnak']['datavalue']['value']['unit'] == unit then&lt;br /&gt;
			isMatchUnit = true&lt;br /&gt;
		end&lt;br /&gt;
		if isMatchUnit ~= inversed then&lt;br /&gt;
			table.insert( resultClaims, statement )&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Filter statements by position&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, position, inversion&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filterByPosition( claims, position, inversed )&lt;br /&gt;
	if not inversed then&lt;br /&gt;
		inversed = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local resultClaims = {};&lt;br /&gt;
	for statementPosition, statement in ipairs( claims ) do&lt;br /&gt;
		if ( statementPosition == tonumber( position ) ) ~= inversed then&lt;br /&gt;
			table.insert( resultClaims, statement )&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Filter statements by qualifier existance or it's value&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, ID of qualifier's property, qualifier's value, inversion&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filterByQualifier( claims, qualifierId, value, inversed )&lt;br /&gt;
	if not inversed then&lt;br /&gt;
		inversed = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	qualifierId = string.upper( qualifierId )&lt;br /&gt;
&lt;br /&gt;
	local resultClaims = {}&lt;br /&gt;
	for i, statement in ipairs( claims ) do&lt;br /&gt;
		if statement['qualifiers'] and statement['qualifiers'][qualifierId] then&lt;br /&gt;
			if value == nil then&lt;br /&gt;
				if ( #statement['qualifiers'][qualifierId] &amp;gt; 0 ) ~= inversed then&lt;br /&gt;
					table.insert( resultClaims, statement )&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				local isQualifierFound = false&lt;br /&gt;
				for j, qualifier in ipairs( statement['qualifiers'][qualifierId] ) do&lt;br /&gt;
					if qualifier['datavalue'] then&lt;br /&gt;
						local qualifierValue = qualifier['datavalue']['value']&lt;br /&gt;
						if qualifier['datavalue']['type'] == 'wikibase-entityid' then&lt;br /&gt;
							qualifierValue = qualifierValue.id&lt;br /&gt;
							value = string.upper( value )&lt;br /&gt;
						end&lt;br /&gt;
			&lt;br /&gt;
						if qualifierValue == value then&lt;br /&gt;
							isQualifierFound = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if isQualifierFound ~= inversed then&lt;br /&gt;
					table.insert( resultClaims, statement )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif inversed then&lt;br /&gt;
			table.insert( resultClaims, statement )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Filter statements by it's values&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, value, inversion&lt;br /&gt;
  Output: filtered statements table&lt;br /&gt;
]]&lt;br /&gt;
function p.filterByValue( claims, value, inversed )&lt;br /&gt;
	inversed = inversed or false&lt;br /&gt;
&lt;br /&gt;
	local resultClaims = {}&lt;br /&gt;
	for i, statement in ipairs( claims ) do&lt;br /&gt;
		local statementValue&lt;br /&gt;
		if statement['mainsnak'] &lt;br /&gt;
		and statement['mainsnak']['datavalue'] &lt;br /&gt;
		and statement['mainsnak']['datavalue']['type']&lt;br /&gt;
		then &lt;br /&gt;
			statementValue = statement['mainsnak']['datavalue']['value']&lt;br /&gt;
			if statement['mainsnak']['datavalue']['type'] == 'wikibase-entityid' then&lt;br /&gt;
				statementValue = statementValue.id&lt;br /&gt;
				value = string.upper( value )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if ( statementValue == value ) ~= inversed then&lt;br /&gt;
			table.insert( resultClaims, statement )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return resultClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wiki&gt;Putnik</name></author>
	</entry>
</feed>