/** * Extract {@link Window} from a {@link Windowing} node. * * @return A {@link Window}. */ public Window extractWindow() { Window window = new Window(); window.setEmit(extractEmit(node)); window.setInclude(extractInclude(node.getInclude())); return window; }
@Override public Optional<List<BulletError>> initialize() { if (window.getEmitType() != Window.Unit.RECORD) { return Optional.of(singletonList(NOT_RECORD)); } // Already checked Number every = Utilities.getCasted(window.getEmit(), Window.EMIT_EVERY_FIELD, Number.class); maxCount = every.intValue(); return super.initialize(); }
@Override public void configure(BulletConfig config) { emitType = getUnit(emit); includeType = getUnit(include); if (Utilities.isEmpty(emit) || emitType != Unit.TIME) { return; } Number every = Utilities.getCasted(emit, EMIT_EVERY_FIELD, Number.class); if (every != null) { int minEmitTime = config.getAs(BulletConfig.WINDOW_MIN_EMIT_EVERY, Integer.class); // Clamp upward to minimum if (every.intValue() < minEmitTime) { emit.put(EMIT_EVERY_FIELD, minEmitTime); } } }
window.initialize().ifPresent(errors::addAll); Aggregation.Type type = aggregation.getType(); Window.Classification kind = window.getType(); if (type != Aggregation.Type.RAW && kind == Window.Classification.RECORD_RECORD) { errors.add(ONLY_RAW_RECORD);
@Override public Optional<List<BulletError>> initialize() { // Window is initialized so every is present and positive. Number every = Utilities.getCasted(window.getEmit(), Window.EMIT_EVERY_FIELD, Number.class); windowLength = every.longValue(); nextCloseTime = System.currentTimeMillis() + windowLength; return Optional.empty(); }
/** * Returns if this query should buffer before emitting the final results. You can use this to wait for the final * results in your Join or Combine stage after a query is {@link #isDone()}. * * @return A boolean that is true if the query results should be buffered in the Join phase. */ public boolean shouldBuffer() { Window window = runningQuery.getQuery().getWindow(); boolean noWindow = window == null; // Only buffer if there is no window (including Raw) or if it's a record based window. return noWindow || !window.isTimeBased(); }
@Override @SuppressWarnings("unchecked") public void configure(BulletConfig config) { if (filters != null) { filters = rewriteClauses(filters); filters.forEach(f -> f.configure(config)); } if (projection != null) { projection.configure(config); } // Must have an aggregation if (aggregation == null) { aggregation = new Aggregation(); } aggregation.configure(config); boolean disableWindowing = config.getAs(BulletConfig.WINDOW_DISABLE, Boolean.class); if (disableWindowing) { window = null; } else if (window != null) { window.configure(config); } long durationDefault = config.getAs(BulletConfig.QUERY_DEFAULT_DURATION, Long.class); long durationMax = config.getAs(BulletConfig.QUERY_MAX_DURATION, Long.class); // Null or negative, then default, else min of duration and max. duration = (duration == null || duration <= 0) ? durationDefault : Math.min(duration, durationMax); if (postAggregations != null) { postAggregations.forEach(p -> p.configure(config)); } }
Window.Classification classification = window.getType(); if (classification == Window.Classification.RECORD_RECORD) { return new SlidingRecord(strategy, window, config);