imported>I9606
have julias function working sort of, but can;t see where it tries to keep track of the coordinates.. don't think it does and don't think you can reverse the path the way it looks like she wants to.
 
(No difference)

Latest revision as of 00:08, 16 October 2015

Documentation for this module may be created at Module:Sandbox/genewiki/experimental/doc

--uncomment and add this to the debug console to run code.
--frame = mw.getCurrentFrame()
--frame.args = {"a", "b", from ="Q14865053"}
--print(p.hello(frame))

---require('Module:Wikidata')	

-- All Lua modules on Wikipedia must begin by defining a variable that will hold their
-- externally accessible functions. They can have any name and may also hold data.
p = {
	devmode	 = false
}



p.getQualifierID = function(frame)
	local propertyID = mw.text.trim(frame.args[1] or "") 
	local qualifierID = mw.text.trim(frame.args[2] or "")
	local input_parm = mw.text.trim(frame.args[3] or "")
	local itemID = mw.text.trim(frame.args[4] or "") --if direct link from wikidata item
	
	if input_parm == "FETCH_WIKIDATA" then
		local entity = ""
		if itemID ~= "" then
			entity = mw.wikibase.getEntityObject(itemID)
		else
			entity = mw.wikibase.getEntityObject()
		end
		if entity.claims[propertyID] ~= nil then
			local out = {}
			for k, v in pairs(entity.claims[propertyID]) do
				for k2, v2 in pairs(v.qualifiers[qualifierID]) do
					if v2.snaktype == 'value' then
							out[#out + 1] = "Q" .. v2.datavalue.value["numeric-id"]
					end
				end
			end
			return table.concat(out, ", ")
		else
			return ""
		end
	else
		return input_parm
	end
end

--- Try to replace this with one function that fails gracefully
--- Get the image URL associated the current article
---{{#invoke:Wikidata|getValueFromID|{{#invoke:Sandbox/genewiki/geneboxdev |getQIDFromID |{{#invoke:Wikidata|pageId}} |P688}}|P18|FETCH_WIKIDATA}}
--- breaks apart to be 
---{{#invoke:Wikidata|getValueFromID|
---	{{#invoke:Sandbox/genewiki/geneboxdev |getQIDFromID |
---		{{#invoke:Wikidata|pageId}} 
---	|P688}}
---|P18|FETCH_WIKIDATA}}
--- testing on ARF6 Q14865053 


p.testEntityId = function(wikidata_qid)
	--pcall pattern does not not work for this..
	--local entity = mw.wikibase.getEntity(wikidata_qid)
	--but it does for locally generated errors like this
	local entity = 2+"error"
	return entity
end

-- test entry point
-- local qid = mw.text.trim(frame.args['from'])
p.hello = function( frame ) 
	local qid = "1Q14865053"
	local out = ""
	--this is like a try statement
	local worked,value = pcall(p.testEntityId, qid) 
	if(worked)
		then out = value 
		else out = "error! "..value
	end
    return out    
end

--gets an image for a qif, doesn't die if no qid is given to it. 
--frame = mw.getCurrentFrame()
--frame.args = {QID="Q14865053"}
--print(p.getDefaultImage(frame))

p.getDefaultImage = function(frame)
	local wikidata_id = mw.text.trim(frame.args['QID'] or "")
	-- "nil" (a string, not the value nil), "number", "string", "boolean", "table", "function", "thread", and "userdata".
	if wikidata_id == nil 
		then return ""
	elseif string.len(wikidata_id) < 3  
		then return ""
	end
	
	local propertyID = "P18"
	local sep = mw.text.trim(" ")
	local imgsize = mw.text.trim("220px")
	local entity = mw.wikibase.getEntity(wikidata_id)
	local claims
	if entity and entity.claims then
		claims = entity.claims[propertyID]
	end
	if claims then
		if (claims[1] and claims[1].mainsnak.datatype == "commonsMedia") then
			local out = {}
			for k, v in pairs(claims) do
				local filename = v.mainsnak.datavalue.value
				out[#out + 1] = "[[File:" .. filename .. "|" .. imgsize .. "]]"
			end
				return table.concat(out, sep)
		else
			return ""
		end
	else
		return input_parm
	end
end

function p.ViewSomething(frame)
	local itemID ="Q14865053"
	local data = mw.wikibase.getEntityObject(itemID)
	if not data then
		return nil
	end

---	local f = frame.args[1] and frame or frame:getParent()

	local i = 1
	while true do
---		local index = f.args[i]
---		if not index then
			if type(data) == "table" then
				return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)
			else
				return tostring(data)
			end
---		end
		
		data = data[index] or data[tonumber(index)]
		if not data then
			return
		end
		
		i = i + 1
	end
end

p.getChromosomeLocJulia = function(frame)
	local propertyID = mw.text.trim(frame.args[1] or "") 
	local qualifierID = mw.text.trim(frame.args[2] or "")
	local input_parm = mw.text.trim(frame.args[3] or "")
	local qualifierIds = p.getQualifierID(frame)
	local newest_build = ""
	local preferred_value = "not set"
	if qualifierIds then
		local list_itemID = mw.text.split(qualifierIds,",")
		for index,value in ipairs(list_itemID) do
  			local entity = mw.wikibase.getEntityObject(value)
			local alias = ""
			if entity['aliases'] ~= nil then
        		local test = entity['aliases']['en']
				for key, value in ipairs(test) do
					if string.match(value['value'], '^hg') then
						alias = value['value']
					end
				end
				local build_no = alias:gsub("hg", "")
				if newest_build < build_no or newest_build == "" then
					newest_build = build_no
					preferred_value = "path here"
				end
			end
		end
		return preferred_value
	else
		return "nnn"
	end
	return "mmm"
end

---getChromosomeLoc 
---input propertyID ie(Genomic start) P644
---      qualifierID (ie GenLoc Assembly) P659
---      input_parm (ie FETCH_WIKIDATA)  
---      {{#invoke:Sandbox/genewiki/geneboxdev|getChromosomeLoc|P644|P659|FETCH_WIKIDATA}}
---output preferred chromosome location start value in this case it would be 49893092

--for debug window -- Q14865053
--frame = mw.getCurrentFrame()
--frame.args = {"P644","P659","FETCH_WIKIDATA","Q14865053"}
--print(p.getChromosomeLoc(frame))

p.getChromosomeLoc = function(frame)
	-- will contain the numeric value for the requested coordinate
	local output = ""
	local sep = " "
	-- can only be P644 (genomic start) or P645 (genomic end) for this to work
	-- should probably try to catch that.  Might also increase legibility to use specific variable names when possible
	local propertyID = mw.text.trim(frame.args[1] or "") 
	-- this can really only be P659 right now.  I'm not sure of the value of including it as a parameter as other values will likely break this function
	local qualifierID = mw.text.trim(frame.args[2] or "")
	-- Why do we include this here?  What should happen if FETCH_WIKIDATA is not included? 
	local input_parm = mw.text.trim(frame.args[3] or "")
	-- this can needs to be fed to the function either by a call to {{#invoke:Wikidata|pageId}} or by setting it directly (e.g. if the function was applied on a page other than the targeted gene)
	--alert if this id is not a valid thing in wikidata, a Lua error will occur that says
	--The ID entered is unknown to the system. Please use a valid entity ID.
	local itemID = mw.text.trim(frame.args[4] or "")
	-- will track the different builds pulled from the qualifiers
	local newest_build = "0"
	-- starts the process
	local entity = mw.wikibase.getEntityObject(itemID)
	local claims
	--gets a table of claims on the (genomic start or end) property Q19847637
	if entity and entity.claims then
		claims = entity.claims[propertyID]
	end
	--will return nothing if no claims are found
	if claims then
		--checking to be sure claims is populated, not sure it its needed
		if (claims[1] ) then
			--useful for debugging
			--local out = {}
			--pulls the genome location from the claim
			for k, v in pairs(claims) do
				local location = v.mainsnak.datavalue.value
				--debugging
				--out[#out + 1] = k.." location:" .. location.. " || " 
				--gets the qualifiers linked to the current claim
				local quals = v.qualifiers.P659 
				--if there are any
				if quals then
					for qk, qv in pairs(quals) do
						local qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]
						--get to the entity targeted by the qualifier property.  Genome builds are Items in wikidata
						local qual_obj = mw.wikibase.getEntityObject(qual_obj_id)
						local alias = ""
						--this uses the aliases to pull out version numbers
						--seems like there ought to be a better way to do this, but likely would need to change the data added by the bot
						if qual_obj["aliases"] ~= nil then
							local test = qual_obj["aliases"]["en"]
							for key, value in ipairs(test) do
								if string.match(value['value'], '^hg') then
									alias = value['value']
									local build_no = alias:gsub("hg","")
									--report only the most location associated with the most recent build
									--if there is more than one location per build, just give one back as that is not our problem right now.
									if build_no > newest_build then
										output = location
										newest_build = build_no
									end
								end
							end
						end
					end
				--in case there are no qualifiers, but there is a location, might as well return it
				else output = location 
				end
			end
				return output
		else
			return ""
		end
	else
		return ""
		--debug
		--"no claims for "..itemID.." prop "..propertyID
	end
end


-- All modules end by returning the variable containing its functions to Wikipedia.
return p

-- We can now use this module by calling {{#invoke: HelloWorld | hello }}.
-- The #invoke command begins with the module's name, in this case "HelloWorld",
-- then takes the name of one of its functions as an argument, in this case "hello".