blob: abda9c977731d14754922bd2f2d4b0b41cb556e8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.client.solrj.response.json;
import java.util.List;
import java.util.Map;
import org.apache.solr.common.util.NamedList;
/**
* Represents the result of a "heatmap" JSON facet.
*
* Allows access to all top-level facet properties (e.g. {@code minX}, {@code maxY}, etc.) as well as the heatmap data
* itself in one of two forms.
*/
public class HeatmapJsonFacet {
private int gridLevel;
private int columns;
private int rows;
private double minX;
private double maxX;
private double minY;
private double maxY;
private List<List<Integer>> countGrid;
private String countEncodedAsBase64PNG;
@SuppressWarnings({"unchecked"})
public HeatmapJsonFacet(NamedList<Object> heatmapNL) {
gridLevel = (int) heatmapNL.get("gridLevel");
columns = (int) heatmapNL.get("columns");
rows = (int) heatmapNL.get("rows");
minX = (double) heatmapNL.get("minX");
maxX = (double) heatmapNL.get("maxX");
minY = (double) heatmapNL.get("minY");
maxY = (double) heatmapNL.get("maxY");
System.out.println("Rows is: " + rows);
System.out.println("Cols is " + columns);
System.out.println("Whole deal is: " + heatmapNL);
if (heatmapNL.get("counts_ints2D") == null) {
countEncodedAsBase64PNG = (String) heatmapNL.get("counts_png");
} else {
countGrid = (List<List<Integer>>) heatmapNL.get("counts_ints2D");
}
}
private int getNumCols(List<List<Integer>> grid) {
for (List<Integer> row : grid) {
if (row !=null ) return row.size();
}
throw new IllegalStateException("All rows in heatmap grid were null!");
}
public List<List<Integer>> getCountGrid() {
return countGrid;
}
public String getCountPng() {
return countEncodedAsBase64PNG;
}
public int getGridLevel() { return gridLevel; }
public int getNumColumns() { return columns; }
public int getNumRows() { return rows; }
public double getMinX() { return minX; }
public double getMaxX() { return maxX; }
public double getMinY() { return minY; }
public double getMaxY() { return maxY; }
/**
* A NamedList is a proper "heatmap" response if it contains <i>all</i> expected properties
*
* We try to be rather strict in determining whether {@code potentialHeatmapValues} is a "heatmap". Users can name
* subfacets arbitrarily, so having some names match those expected in a "heatmap" response could just be coincidence.
* <p>
* Heatmap facets do not support subfacets.
*/
public static boolean isHeatmapFacet(NamedList<Object> potentialHeatmapValues) {
boolean hasGridLevel = false;
boolean hasColumns = false;
boolean hasRows = false;
boolean hasMinX = false;
boolean hasMaxX = false;
boolean hasMinY = false;
boolean hasMaxY = false;
boolean hasCountGrid = false;
for (Map.Entry<String, Object> entry : potentialHeatmapValues) {
String key = entry.getKey();
if ("gridLevel".equals(key)) {
hasGridLevel = true;
} else if ("columns".equals(key)) {
hasColumns = true;
} else if ("rows".equals(key)) {
hasRows = true;
} else if ("minX".equals(key)) {
hasMinX = true;
} else if ("maxX".equals(key)) {
hasMaxX = true;
} else if ("minY".equals(key)) {
hasMinY = true;
} else if ("maxY".equals(key)){
hasMaxY = true;
} else if (key != null && key.startsWith("counts_")) {
hasCountGrid = true;
}
}
return potentialHeatmapValues.size() == 8 && hasGridLevel && hasColumns && hasRows && hasMinX && hasMaxX && hasMinY
&& hasMaxY && hasCountGrid;
}
}