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
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)
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)]]]