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