// Recursively compute size of the dds to be returned private long computeSize(DConstructor ctor, boolean isAscii) throws Exception { long projectsize = 0; // accumulate size of projected variables long othersize = 0; // accumulate size of non-projected variables long fieldsize = 0; int projectedcount = 0; int fieldcount = 0; Enumeration vars = ctor.getVariables(); while (vars.hasMoreElements()) { fieldcount++; BaseType field = (BaseType) vars.nextElement(); fieldsize = computeFieldSize(field, isAscii); // accumulate the field sizes if (field.isProject()) { projectsize += fieldsize; projectedcount++; } else { othersize += fieldsize; } } // Cases to consider: // 1. If all of the fields of this ctor are projected, // then return projectsize // 2. If none of the fields of this ctor are projected, // then return othersize // 3. otherwise, at least one field, but not all, is projected, // => return projectsize; if (projectedcount == fieldcount) return projectsize; else if (projectedcount == 0) return othersize; else { assert (projectedcount > 0 && projectedcount < fieldcount); return projectsize; } }
/** * Eliminates array dimensions whose dimensions are 1 (and thus in practice don't exisit) * * @param dds The DDS to traverse and squeeze its member arrays. */ public static void squeezeArrays(DConstructor dds) { DArray a; Enumeration e = dds.getVariables(); while (e.hasMoreElements()) { opendap.dap.BaseType bt = (opendap.dap.BaseType) e.nextElement(); if (bt instanceof DArray) { a = (DArray) bt; log.debug("Squeezing array " + a.getTypeName() + " " + a.getLongName() + ";"); a.squeeze(); // System.out.print("Post squeezing: "); // a.printDecl(System.out); bt = a.getPrimitiveVector().getTemplate(); if (bt instanceof DConstructor) squeezeArrays((DConstructor) bt); } else if (bt instanceof DConstructor) { squeezeArrays((DConstructor) bt); } } }