<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://wiki-raamsdonk.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidataSelectors</id>
	<title>Module:WikidataSelectors - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-raamsdonk.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikidataSelectors"/>
	<link rel="alternate" type="text/html" href="https://wiki-raamsdonk.nl/index.php?title=Module:WikidataSelectors&amp;action=history"/>
	<updated>2026-04-05T20:26:19Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki-raamsdonk.nl/index.php?title=Module:WikidataSelectors&amp;diff=78056&amp;oldid=prev</id>
		<title>Colani: 1 versie geïmporteerd</title>
		<link rel="alternate" type="text/html" href="https://wiki-raamsdonk.nl/index.php?title=Module:WikidataSelectors&amp;diff=78056&amp;oldid=prev"/>
		<updated>2024-03-26T11:11:54Z</updated>

		<summary type="html">&lt;p&gt;1 versie geïmporteerd&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&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;
	&amp;#039;best&amp;#039;,&lt;br /&gt;
	&amp;#039;preferred&amp;#039;,&lt;br /&gt;
	&amp;#039;normal&amp;#039;,&lt;br /&gt;
	&amp;#039;deprecated&amp;#039;&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, &amp;#039;^[Pp]%d+&amp;#039; )&lt;br /&gt;
	if not propertyId then&lt;br /&gt;
		propertyId = &amp;#039;&amp;#039;&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;
	rules = p.matchSelectors( propertySelector, initPos )&lt;br /&gt;
&lt;br /&gt;
	-- If there is no rank filter, than default rank is &amp;#039;best&amp;#039;&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[&amp;#039;type&amp;#039;] == &amp;#039;rank&amp;#039; 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 = &amp;#039;rank&amp;#039;, value = &amp;#039;best&amp;#039; } } )&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 = &amp;#039;^%s*%[%s*[^%[%]]+%s*%]%s*&amp;#039;&lt;br /&gt;
	local rulePattern = &amp;#039;^%s*%[%s*([^%[%]]+)%s*%]%s*$&amp;#039;&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, &amp;#039;%s*,%s*&amp;#039; )&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, &amp;#039;^!&amp;#039; ) then&lt;br /&gt;
				isInversed = true&lt;br /&gt;
				subRule = mw.ustring.match( subRule, &amp;#039;^!%s*(.+)$&amp;#039; )&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- p123[1]&lt;br /&gt;
			if mw.ustring.match( subRule, &amp;#039;^%d+$&amp;#039; ) then&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;position&amp;#039;,&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, &amp;#039;^rank%s*:%s*(%a+)$&amp;#039; ) then&lt;br /&gt;
				rank = mw.ustring.match( subRule, &amp;#039;^rank%s*:%s*(%a+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;rank&amp;#039;,&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, &amp;#039;^language%s*:%s*([%a-]+)$&amp;#039; ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;^language%s*:%s*(%a+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;language&amp;#039;,&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, &amp;#039;^language%s*!:%s*([%a-]+)$&amp;#039; ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;^language%s*!:%s*(%a+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;language&amp;#039;,&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, &amp;#039;^unit%s*:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;unit&amp;#039;,&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, &amp;#039;^unit%s*!:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;!:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;unit&amp;#039;,&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, &amp;#039;^[Pp]%d+$&amp;#039; ) then&lt;br /&gt;
				qualifier = mw.ustring.match( subRule, &amp;#039;^[Pp]%d+&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;qualifier&amp;#039;,&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, &amp;#039;^[Pp]%d+%s*:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
				qualifier = mw.ustring.match( subRule, &amp;#039;^([Pp]%d+)%s*:?&amp;#039; )&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;qualifier&amp;#039;,&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, &amp;#039;^[Pp]%d+%s*!:%s*[^%[%],:]+$&amp;#039; ) then&lt;br /&gt;
				qualifier = mw.ustring.match( subRule, &amp;#039;^([Pp]%d+)%s*!:?&amp;#039; )&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;!:%s*([^%[%],:]+)$&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;qualifier&amp;#039;,&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, &amp;#039;^[Qq]%d+$&amp;#039; ) then&lt;br /&gt;
				value = mw.ustring.match( subRule, &amp;#039;^[Qq]%d+&amp;#039; )&lt;br /&gt;
				table.insert( commands, {&lt;br /&gt;
					type = &amp;#039;value&amp;#039;,&lt;br /&gt;
					value = value,&lt;br /&gt;
					inversed = isInversed&lt;br /&gt;
				} )&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
				throwError( &amp;#039;cant-parse-condition&amp;#039; )&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[&amp;#039;type&amp;#039;] == &amp;#039;rank&amp;#039; then&lt;br /&gt;
				table.insert( newClaims, p.filterByRank( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
			elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;language&amp;#039; then&lt;br /&gt;
				table.insert( newClaims, p.filterByLanguage( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
			elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;unit&amp;#039; then&lt;br /&gt;
				table.insert( newClaims, p.filterByUnit( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
			elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;position&amp;#039; then&lt;br /&gt;
				table.insert( newClaims, p.filterByPosition( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
			elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;qualifier&amp;#039; then&lt;br /&gt;
				table.insert( newClaims, p.filterByQualifier( claims, rule[&amp;#039;qualifier&amp;#039;], rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&lt;br /&gt;
			elseif rule[&amp;#039;type&amp;#039;] == &amp;#039;value&amp;#039; then&lt;br /&gt;
				table.insert( newClaims, p.filterByValue( claims, rule[&amp;#039;value&amp;#039;], rule[&amp;#039;inversed&amp;#039;] ) )&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&amp;#039;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[&amp;#039;id&amp;#039;] == newClaim[&amp;#039;id&amp;#039;] 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 = &amp;#039;best&amp;#039;&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( &amp;#039;rank-not-valid&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the best rank&lt;br /&gt;
	if rank == &amp;#039;best&amp;#039; then&lt;br /&gt;
		rank = &amp;#039;normal&amp;#039; -- default rank (don&amp;#039;t use deprecated even if it&amp;#039;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 == &amp;#039;preferred&amp;#039;) then&lt;br /&gt;
				rank = &amp;#039;preferred&amp;#039;&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;
	for i, statement in ipairs( claims ) do&lt;br /&gt;
		isMatchLanguage = false&lt;br /&gt;
		if statement[&amp;#039;mainsnak&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;language&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;language&amp;#039;] == language then&lt;br /&gt;
			isMatchLanguage = true&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;
	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 = &amp;#039;http://www.wikidata.org/entity/&amp;#039; .. 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[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;unit&amp;#039;])&lt;br /&gt;
		if statement[&amp;#039;mainsnak&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;unit&amp;#039;]&lt;br /&gt;
				and statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;unit&amp;#039;] == 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&amp;#039;s value&lt;br /&gt;
 &lt;br /&gt;
  Input: claims table, ID of qualifier&amp;#039;s property, qualifier&amp;#039;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[&amp;#039;qualifiers&amp;#039;] and statement[&amp;#039;qualifiers&amp;#039;][qualifierId] then&lt;br /&gt;
			if value == nil then&lt;br /&gt;
				if ( #statement[&amp;#039;qualifiers&amp;#039;][qualifierId] &amp;gt; 0 ) ~= inversed then&lt;br /&gt;
					table.insert( resultClaims, statement )&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				for j, qualifier in ipairs( statement[&amp;#039;qualifiers&amp;#039;][qualifierId] ) do&lt;br /&gt;
					local qualifierValue = qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
					if qualifier[&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
						qualifierValue = &amp;#039;Q&amp;#039; .. qualifierValue[&amp;#039;numeric-id&amp;#039;]&lt;br /&gt;
						value = string.upper( value )&lt;br /&gt;
					end&lt;br /&gt;
		&lt;br /&gt;
					if ( qualifierValue == value ) ~= inversed then&lt;br /&gt;
						table.insert( resultClaims, statement )&lt;br /&gt;
						break&lt;br /&gt;
					end&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&amp;#039;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;
	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 i, statement in ipairs( claims ) do&lt;br /&gt;
		local statementValue = statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;]&lt;br /&gt;
		if statement[&amp;#039;mainsnak&amp;#039;][&amp;#039;datavalue&amp;#039;][&amp;#039;type&amp;#039;] == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
			statementValue = &amp;#039;Q&amp;#039; .. statementValue[&amp;#039;numeric-id&amp;#039;]&lt;br /&gt;
			value = string.upper( value )&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>Colani</name></author>
	</entry>
</feed>