inline ArrayDesc createWindowDesc(ArrayDesc const& desc) { Dimensions const& dims = desc.getDimensions(); Dimensions aggDims(dims.size()); for (size_t i = 0, n = dims.size(); i < n; i++) { DimensionDesc const& srcDim = dims[i]; aggDims[i] = DimensionDesc(srcDim.getBaseName(), srcDim.getNamesAndAliases(), srcDim.getStartMin(), srcDim.getCurrStart(), srcDim.getCurrEnd(), srcDim.getEndMax(), srcDim.getChunkInterval(), 0, srcDim.getType(), srcDim.getFlags(), srcDim.getMappingArrayName(), srcDim.getComment(), srcDim.getFuncMapOffset(), srcDim.getFuncMapScale()); } ArrayDesc output (desc.getName(), Attributes(), aggDims); for (size_t i = dims.size() * 2, size = _parameters.size(); i < size; i++) { addAggregatedAttribute( (shared_ptr <OperatorParamAggregateCall> &) _parameters[i], desc, output); } if ( desc.getEmptyBitmapAttribute()) { AttributeDesc const* eAtt = desc.getEmptyBitmapAttribute(); output.addAttribute(AttributeDesc(output.getAttributes().size(), eAtt->getName(), eAtt->getType(), eAtt->getFlags(), eAtt->getDefaultCompressionMethod())); } return output; }
ArrayDesc inferSchema(std::vector<ArrayDesc> schemas, std::shared_ptr<Query> query) { assert(schemas.size() == 1); ArrayDesc const& inputDesc = schemas[0]; size_t nDims = inputDesc.getDimensions().size(); Dimensions outDims(nDims); // How many parameters are of each type. size_t numAggregateCalls = 0; size_t numChunkSizes = 0; for (size_t i = nDims, n = _parameters.size(); i < n; ++i) { if (_parameters[i]->getParamType() == PARAM_AGGREGATE_CALL) { ++numAggregateCalls; } else // chunk size { ++numChunkSizes; } } if (numChunkSizes && numChunkSizes != nDims) { throw USER_EXCEPTION(SCIDB_SE_INFER_SCHEMA, SCIDB_LE_NUM_CHUNKSIZES_NOT_MATCH_NUM_DIMS) << "regrid()"; } // Generate the output dims. for (size_t i = 0; i < nDims; i++) { int64_t blockSize = evaluate(((std::shared_ptr<OperatorParamLogicalExpression>&)_parameters[i])->getExpression(), query, TID_INT64).getInt64(); if (blockSize <= 0) { throw USER_QUERY_EXCEPTION(SCIDB_SE_INFER_SCHEMA, SCIDB_LE_OP_REGRID_ERROR1, _parameters[i]->getParsingContext()); } DimensionDesc const& srcDim = inputDesc.getDimensions()[i]; int64_t chunkSize = srcDim.getRawChunkInterval(); if (numChunkSizes) { size_t index = i + nDims + numAggregateCalls; chunkSize = evaluate(((std::shared_ptr<OperatorParamLogicalExpression>&)_parameters[index])->getExpression(), query, TID_INT64).getInt64(); if (chunkSize<=0) { throw USER_EXCEPTION(SCIDB_SE_INFER_SCHEMA, SCIDB_LE_CHUNK_SIZE_MUST_BE_POSITIVE); } } outDims[i] = DimensionDesc( srcDim.getBaseName(), srcDim.getNamesAndAliases(), srcDim.getStartMin(), srcDim.getStartMin(), srcDim.getEndMax() == CoordinateBounds::getMax() ? CoordinateBounds::getMax() : srcDim.getStartMin() + (srcDim.getLength() + blockSize - 1)/blockSize - 1, srcDim.getEndMax() == CoordinateBounds::getMax() ? CoordinateBounds::getMax() : srcDim.getStartMin() + (srcDim.getLength() + blockSize - 1)/blockSize - 1, chunkSize, 0 ); } // Input and output dimensions are 1-to-1, so... _fixer.takeAllDimensions(inputDesc.getDimensions()); ArrayDesc outSchema(inputDesc.getName(), Attributes(), outDims, defaultPartitioning(), query->getDefaultArrayResidency() ); for (size_t i = nDims, j=nDims+numAggregateCalls; i<j; i++) { bool isInOrderAggregation = false; addAggregatedAttribute( (std::shared_ptr <OperatorParamAggregateCall> &) _parameters[i], inputDesc, outSchema, isInOrderAggregation); } AttributeDesc et ((AttributeID) outSchema.getAttributes().size(), DEFAULT_EMPTY_TAG_ATTRIBUTE_NAME, TID_INDICATOR, AttributeDesc::IS_EMPTY_INDICATOR, 0); outSchema.addAttribute(et); return outSchema; }