/** * Perform operator-specific checks of input and return the shape of the output. Currently, * the output array must exist. * @param schemas the shapes of the input arrays * @param query the query context */ ArrayDesc inferSchema(std::vector< ArrayDesc> schemas, std::shared_ptr< Query> query) { SCIDB_ASSERT(schemas.size() == 1); SCIDB_ASSERT(_parameters.size() == 1); string arrayNameOrg = ((std::shared_ptr<OperatorParamReference>&)_parameters[0])->getObjectName(); SCIDB_ASSERT(ArrayDesc::isNameUnversioned(arrayNameOrg)); //Ensure attributes names uniqueness. std::string arrayName; std::string namespaceName; query->getNamespaceArrayNames(arrayNameOrg, namespaceName, arrayName); ArrayDesc dstDesc; ArrayDesc const& srcDesc = schemas[0]; ArrayID arrayId = query->getCatalogVersion(namespaceName, arrayName); bool fArrayDesc = scidb::namespaces::Communicator::getArrayDesc( namespaceName, arrayName, arrayId, dstDesc, false); if (!fArrayDesc) { throw USER_EXCEPTION(SCIDB_SE_INFER_SCHEMA, SCIDB_LE_ARRAY_DOESNT_EXIST) << arrayName; } ArrayDesc::checkConformity(srcDesc, dstDesc, ArrayDesc::IGNORE_PSCHEME | ArrayDesc::IGNORE_OVERLAP | ArrayDesc::IGNORE_INTERVAL); // allows auto-repart() SCIDB_ASSERT(dstDesc.getId() == dstDesc.getUAId()); SCIDB_ASSERT(dstDesc.getName() == arrayName); SCIDB_ASSERT(dstDesc.getUAId() > 0); return dstDesc; }