def asVOT(self, ctx, accessURL, linkIdTo=None):
        """returns VOTable stanxml for a description of this service.

		This is a RESOURCE as required by Datalink.

		linkIdTo is used to support data access descriptors embedded
		in descovery queries.  It is the id of the column containing
		the identifiers.  SSA can already provide this.  It ends up
		in a LINK child of the ID parameter.
		"""
        paramsByName, stcSpecs = {}, set()
        for param in self.inputKeys:
            paramsByName[param.name] = param
            if param.stc:
                stcSpecs.add(param.stc)

        def getIdFor(colRef):
            colRef.toParam = True
            return ctx.makeIdFor(paramsByName[colRef.dest])

        res = V.RESOURCE(
            ID=ctx.getOrMakeIdFor(self), type="meta", utype="adhoc:service")[
                [modelgroups.marshal_STC(ast, getIdFor) for ast in stcSpecs],
                V.PARAM(arraysize="*",
                        datatype="char",
                        name="accessURL",
                        ucd="meta.ref.url",
                        value=accessURL)]

        standardId = {
            "dlasync": "ivo://ivoa.net/std/SODA#async-1.0",
            "dlget": "ivo://ivoa.net/std/SODA#sync-1.0"
        }.get(self.rendName)
        if standardId:
            res[V.PARAM(arraysize="*",
                        datatype="char",
                        name="standardID",
                        value=standardId)]

        inputParams = V.GROUP(name="inputParams")
        res = res[inputParams]

        for ik in self.inputKeys:
            param = ctx.addID(
                ik, votablewrite.makeFieldFromColumn(ctx, V.PARAM, ik))
            if linkIdTo and ik.name == "ID":
                param = param(ref=linkIdTo)
            inputParams[param]

        return res
Example #2
0
    def getVOT(self, ctx):
        attrs = votable.guessParamAttrsForValue(self.value)
        attrs.update({"unit": self.unit, "ucd": self.ucd})

        param = V.PARAM(name=self.name,
                        id=ctx.getOrMakeIdFor(self.value),
                        **attrs)[V.VODML[V.ROLE[completeVODMLId(
                            ctx, self.name)]]]
        votable.serializeToParam(param, self.value)
        return param
def _makeVOTParam(ctx, param):
	"""returns VOTable stan for param.
	"""
	# note that we're usually accessing the content, i.e., the string
	# serialization we got.  The only exception is when we're seeing
	# nulls or null-equivalents.
	if param.content_ is base.NotGiven or param.value is None:
		content = None
	else:
		content = param.content_

	el = V.PARAM()
	defineField(ctx, el, valuemappers.AnnotatedColumn(param))
	if content is None:
		el.value = ""
	else:
		el.value = content
	return el
def _iterParams(ctx, dataSet):
	"""iterates over the entries in the parameters table of dataSet.
	"""
# deprecate this.  The parameters table of a data object was a grave
# mistake.
# Let's see who's using it and then remove this in favor of actual
# data parameters (or table parameters)
	try:
		parTable = dataSet.getTableWithRole("parameters")
	except base.DataError:  # no parameter table
		return

	warnings.warn("Parameters table used.  You shouldn't do that any more.")
	values = {}
	if parTable:  # no data for parameters: keep empty values.
		values = parTable.rows[0]

	for item in parTable.tableDef:
		colDesc = valuemappers.AnnotatedColumn(item)
		el = V.PARAM()
		el(value=ctx.mfRegistry.getMapper(colDesc)(values.get(item.name)))
		defineField(ctx, el, colDesc)
		ctx.addID(el, item)
		yield el
Example #5
0
    def _run_queryData(self, service, inputTable, queryMeta):
        format = inputTable.getParam("FORMAT") or ""
        if format.lower() == "metadata":
            return self._makeMetadata(service)

        limits = [
            q for q in (inputTable.getParam("MAXREC", None),
                        inputTable.getParam("TOP")) if q
        ]
        if not limits:
            limits = [base.getConfig("ivoa", "dalDefaultLimit")]
        limit = min(min(limits), base.getConfig("ivoa", "dalHardLimit"))
        queryMeta["dbLimit"] = limit

        res = svcs.DBCore.run(self, service, inputTable, queryMeta)
        if len(res) == limit:
            queryStatus = "OVERFLOW"
            queryStatusBody = (
                "Exactly %s rows were returned.  This means your"
                " query probably reached the match limit.  Increase MAXREC." %
                limit)
        else:
            queryStatus = "OK"
            queryStatusBody = ""

        self._addPreviewLinks(res)

        # We wrap our result into a data instance since we need to set the
        #	result type
        data = rsc.wrapTable(res)
        data.setMeta("_type", "results")
        data.addMeta("_votableRootAttributes",
                     'xmlns:ssa="http://www.ivoa.net/xml/DalSsap/v1.0"')

        # The returnRaw property is a hack, mainly for unit testing;
        # The renderer would have to add the QUERY_STATUS here.
        if service.getProperty("returnData", False):
            return data

        # we fix tablecoding to td for now since nobody seems to like
        # binary tables and we don't have huge tables here.
        votCtx = votablewrite.VOTableContext(tablecoding="td")

        vot = votablewrite.makeVOTable(data, votCtx)
        pubDIDId = votCtx.getIdFor(res.tableDef.getColumnByName("ssa_pubDID"))
        resElement = vot.getChildDict()["RESOURCE"][0]
        resElement[
            V.INFO(name="SERVICE_PROTOCOL", value=self.ssapVersion)["SSAP"],
            V.INFO(name="QUERY_STATUS", value=queryStatus)[queryStatusBody]]

        datalinkId = service.getProperty("datalink", None)
        if datalinkId and res:
            dlService = self.rd.getById(datalinkId)
            dlCore = getDatalinkCore(dlService, res)

            # new and shiny datalink (keep)
            # (we're just using endpoint 0; it should a the sync service)
            dlEndpoint = dlCore.datalinkEndpoints[0]
            vot[dlEndpoint.asVOT(votCtx,
                                 dlService.getURL(dlEndpoint.rendName),
                                 linkIdTo=pubDIDId)]

            # Also point to the dl metadata service
            vot[V.RESOURCE(type="meta", utype="adhoc:service")[
                V.PARAM(name="standardID",
                        datatype="char",
                        arraysize="*",
                        value="ivo://ivoa.net/std/DataLink#links-1.0"),
                V.PARAM(name="accessURL",
                        datatype="char",
                        arraysize="*",
                        value=self.rd.getById(datalinkId).getURL("dlmeta")),
                V.GROUP(name="inputParams")[V.PARAM(
                    name="ID",
                    datatype="char",
                    arraysize="*",
                    ref=pubDIDId,
                    ucd="meta.id;meta.main"
                )[V.LINK(content_role="ddl:id-source", value="#" +
                         pubDIDId)]]]]

        return "application/x-votable+xml", votable.asString(vot)