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
def _makeResource(ctx, data):
	"""returns a Resource node for the rsc.Data instance data.
	"""
	res = V.RESOURCE()
	with ctx.activeContainer(res):
		res(type=base.getMetaText(data, "_type"),
				utype=base.getMetaText(data, "utype"))[
			_iterResourceMeta(ctx, data),
			_iterParams(ctx, data), [
				_makeVOTParam(ctx, param) for param in data.iterParams()],
			_linkBuilder.build(data.dd),
			]
		for table in data:
			with ctx.buildingFromTable(table):
				res[makeTable(ctx, table)]
		res[ctx.overflowElement]
	return res
예제 #3
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)
예제 #4
0
 def _makeErrorTable(self, ctx, msg, queryStatus="ERROR"):
     # FatalFault, DefaultFault
     return V.VOTABLE[V.RESOURCE(type="results")[V.INFO(
         name="QUERY_STATUS", value=queryStatus)[str(msg)]]]