/** * Returns the total time range contained by this layer at the given time. */ public TimeRange getTotalRange(Time now) { Time startGranOffset = Time.inNanos(bigGran.getNanos() * bigGransIncludeStart); Time startTime = now.alignDownToGranularity(bigGran).plus(startGranOffset); if (startTime.isBefore(Time.inNanos(0))) { throw new IllegalArgumentException("Layer start time went negative. Use a bigger 'now'. now=" + now); } return TimeRange.between(startTime, startTime.plus(getTotalTime())); }
private void assertStructureValid() { for (GranularityLayer layer : struct.getLayers()) { PageDefinition def = pageDefs.getDefinition(layer.getGranularity()); Granularity width = def.getPageWidth(); if (layer.getTotalTime().isSmallerThan(width.times(numPagesPerLayer)) == false) { throw new IllegalStateException(width + " times " + numPagesPerLayer + " not bigger than layer " + layer.getGranularity() + " width of " + layer.getTotalTime()); } long entriesPerPage = def.getEntriesPerPage(); if (entriesPerPage < 3) { throw new IllegalStateException("Layer " + layer.getGranularity() + " does not have >= 3 entries per page"); } if (entriesPerPage >= 30) { throw new IllegalStateException("Layer " + layer.getGranularity() + " has " + entriesPerPage + "entries per page. We want < 30"); } if (!width.isEvenMultipleOf(layer.getGranularity())) { throw new IllegalStateException("Width of page " + width + " for gran=" + layer.getGranularity() + " is not an even multiple of " + layer.getGranularity()); } } }
/** * Makes a page definition which satisfies the layer requirements. * * The following is true about the result: * The page's width will be a multiple of the layer's entry granularity * The page's width * pagesPerLayer will be >= the layer's total time */ private static PageDefinition makeDefinitionForLayer(GranularityLayer layer, int pagesPerLayer) { Time pageWidth = layer.getTotalTime().divideBy(pagesPerLayer - 1); Time alignedWidth = pageWidth.alignUpToGranularity(layer.getGranularity()); return new PageDefinition(layer.getGranularity(), alignedWidth.asGranularity()); }