I am developing geomesa client to perform basic read write and delete operations. I have also created a function which will return matching feature count for specified query, however it always returns zero, i also tried DataStore stats for fetching the matching feature count but it is very slow. Below is my client code:
package com.hps;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;
import java.util.Map;
import org.geotools.data.DataStore;
import org.geotools.data.DataStoreFinder;
import org.geotools.data.FeatureSource;
import org.geotools.data.FeatureStore;
import org.geotools.data.Query;
import org.geotools.data.Transaction;
import org.geotools.data.shapefile.dbf.DbaseFileHeader;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.factory.Hints;
import org.geotools.filter.text.cql2.CQL;
import org.geotools.filter.text.ecql.ECQL;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.locationtech.geomesa.accumulo.data.AccumuloAppendFeatureWriter;
import org.locationtech.geomesa.accumulo.data.AccumuloDataStore;
import org.locationtech.geomesa.index.utils.ExplainLogging;
import org.locationtech.geomesa.utils.interop.SimpleFeatureTypes;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import com.hps.schemas.Event;
import com.hps.schemas.QueryAdvanced;
import com.hps.schemas.QueryBasic;
import com.vividsolutions.jts.geom.Coordinate;
public class GeomesaClient {
private AccumuloDataStore ds = null;
private AccumuloAppendFeatureWriter fw = null;
private SimpleFeatureSource sfs = null;
private FeatureSource fs = null;
private String tableName = "";
private boolean isFlushed = true;
private long lastFlushTs = 0;
private FeatureStore fst = null;
private SimpleFeatureType sft;
public interface QueryListener {
public void onFeature(SimpleFeature f);
}
public GeomesaClient(Map<String, String> dsConf) throws Exception {
this.ds = (AccumuloDataStore) DataStoreFinder.getDataStore(dsConf);
this.tableName = dsConf.get("tableName");
sft = createFeatureType();
if(!Arrays.asList(this.ds.getTypeNames()).contains(sft.getTypeName())){
ds.createSchema(sft);
}
this.fw = (AccumuloAppendFeatureWriter) (this.ds.getFeatureWriterAppend(sft.getTypeName(),
Transaction.AUTO_COMMIT));
this.sfs = ds.getFeatureSource(sft.getTypeName());
this.fs = ((DataStore) ds).getFeatureSource(sft.getTypeName());
this.fst = (FeatureStore) sfs;
}
private SimpleFeatureType createFeatureType() {
try{
StringBuilder simpleFeatureTypeBuilder = new StringBuilder();
simpleFeatureTypeBuilder.append("r:Long:index=true:cardinality=high,");
// device data
// "*g:Point:srid=4326," + "di:Integer:index=full:cardinality=high," +
// "al:Float:index=join:cardinality=low,"
// + "s:Float:index=join:cardinality=low," +
// "b:Float:index=join:cardinality=low,"
// + "an:Float:index=join:cardinality=low," +
// "he:Float:index=join:cardinality=low,"
// + "ve:Float:index=join:cardinality=low," +
// "t:Float:index=join:cardinality=low,"
// + "m:Boolean:index=join:cardinality=low," +
// "i:Boolean:index=join:cardinality=low,"
// + "ts:Long:index=join:cardinality=low;" +
// "geomesa.indexes.enabled='attr_idx,records,z2'";
// simpleFeatureTypeBuilder.append("*g:Point:srid=4326,");
// simpleFeatureTypeBuilder.append("di:Integer,");
// simpleFeatureTypeBuilder.append("al:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("s:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("b:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("an:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("he:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("ve:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("t:Float:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("m:Boolean:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("i:Boolean:index=join:cardinality=low,");
// simpleFeatureTypeBuilder.append("ts:Long:index=join:cardinality=low;");
simpleFeatureTypeBuilder.append("*g:Point:srid=4326,");
simpleFeatureTypeBuilder.append("di:Integer,");
simpleFeatureTypeBuilder.append("al:Float,");
simpleFeatureTypeBuilder.append("s:Float,");
simpleFeatureTypeBuilder.append("b:Float,");
simpleFeatureTypeBuilder.append("an:Float,");
simpleFeatureTypeBuilder.append("he:Float,");
simpleFeatureTypeBuilder.append("ve:Float,");
simpleFeatureTypeBuilder.append("t:Float,");
simpleFeatureTypeBuilder.append("m:Boolean,");
simpleFeatureTypeBuilder.append("i:Boolean,");
simpleFeatureTypeBuilder.append("ts:Long;");
simpleFeatureTypeBuilder.append("geomesa.indexes.enabled='attr,records,z2'");
return SimpleFeatureTypes.createType(tableName, simpleFeatureTypeBuilder.toString());
}
catch(Exception ex){
ex.printStackTrace();
return null;
}
}
public void insert(Event event) {
try{
SimpleFeature sf = fw.next();
sf.getUserData().put(Hints.USE_PROVIDED_FID, java.lang.Boolean.FALSE);
sf.setAttribute("r", event.rideid);
sf.setAttribute("di", event.devid);
sf.setAttribute("g", JTSFactoryFinder.getGeometryFactory().createPoint(new Coordinate(event.lat, event.lng)));
sf.setAttribute("al", event.alt);
sf.setAttribute("s", event.spd);
sf.setAttribute("b", event.brg);
sf.setAttribute("an", event.ang);
sf.setAttribute("he", event.hepe);
sf.setAttribute("ve", event.vepe);
sf.setAttribute("t", event.temp);
sf.setAttribute("m", event.motion);
sf.setAttribute("i", event.ignition);
sf.setAttribute("ts", event.ts);
fw.write();
isFlushed = false;
flush(false);
}
catch(Exception ex){
ex.printStackTrace();
}
}
public void flush(boolean force) {
if(!isFlushed && System.currentTimeMillis() - lastFlushTs >= 1000){
fw.flush();
isFlushed = true;
lastFlushTs = System.currentTimeMillis();
System.out.println("flush success");
}
else if(force){
System.out.println("flush failed");
lastFlushTs = System.currentTimeMillis();
}
}
public void query(String queryStr, Integer limit, Integer offset, QueryListener ql) {
System.out.println("queryString : " + queryStr);
System.out.println("limit : " + limit);
System.out.println("offset : " + offset);
SimpleFeatureIterator iterator = null;
try{
if(queryStr != null && !queryStr.isEmpty()){
Query query = new Query(tableName, CQL.toFilter(queryStr));
// FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
// SortBy[] sort = new SortBy[] { ff.sort("ts", SortOrder.DESCENDING) };
// query.setSortBy(sort);
if(limit != null && limit > 0)
query.setMaxFeatures(limit);
if(offset != null && offset > 0)
query.setStartIndex(offset);
System.out.println("Query : " + query.toString());
iterator = sfs.getFeatures(query).features();
System.out.println("Before iterator while");
while(iterator.hasNext()){
ql.onFeature(iterator.next());
}
System.out.println("Exiting iterator while");
}
}
catch(Exception ex){
ex.printStackTrace();
}
finally{
if(iterator != null)
iterator.close();
}
}
public int getRideCount(Long rideId) throws Exception {
int count = 0;
if(rideId != null){
count = fs.getCount(new Query(tableName, CQL.toFilter("r="+rideId)));
//count = ((Long) (ds.stats().getCount(sft, CQL.toFilter("r=" + rideId), true).get())).intValue();
}
return count;
}
public void delete(QueryBasic criteria) throws Exception {
fst.removeFeatures(ECQL.toFilter(getQuery(criteria)));
}
/*
* Query/Filter functions
*/
private void appendQuery(StringBuilder original, String query) {
if(original.length() > 0)
original.append(" AND ");
original.append(query);
}
public String getQuery(QueryBasic filter) {
StringBuilder qryStrBldr = null;
try{
if(filter != null){
qryStrBldr = new StringBuilder();
if(filter.rideid != null && filter.rideid >= -1){
appendQuery(qryStrBldr, "r = " + filter.rideid);
}
if(filter.devid != null && filter.devid > 0){
appendQuery(qryStrBldr, "di = " + filter.devid);
}
if(filter.tsFr != null && filter.tsFr > 0){
appendQuery(qryStrBldr, "ts >= " + filter.tsFr);
}
if(filter.tsTo != null && filter.tsTo > 0){
appendQuery(qryStrBldr, "ts <= " + filter.tsTo);
}
}
}
catch(Exception ex){
ex.printStackTrace();
}
return qryStrBldr.toString();
}
public String getQuery(QueryAdvanced advanceFilter) {
try{
if(advanceFilter != null){
QueryBasic basic = advanceFilter.basic;
StringBuilder qryStrBldr = new StringBuilder();
qryStrBldr.append(getQuery(basic));
if(qryStrBldr.length() > 0){
if(advanceFilter.latFr != null && advanceFilter.latTo != null && advanceFilter.lngFr != null
&& advanceFilter.lngTo != null){
appendQuery(qryStrBldr, "BBOX(g, " + advanceFilter.latFr + ", " + advanceFilter.lngFr + ", "
+ advanceFilter.latTo + ", " + advanceFilter.lngTo + ")");
}
if(advanceFilter.altFr != null && advanceFilter.altFr > 0){
appendQuery(qryStrBldr, "al >= " + advanceFilter.altFr);
}
if(advanceFilter.altTo != null && advanceFilter.altTo > 0){
appendQuery(qryStrBldr, "al <= " + advanceFilter.altTo);
}
if(advanceFilter.spdFr != null && advanceFilter.spdFr > 0){
appendQuery(qryStrBldr, "s >= " + advanceFilter.spdFr);
}
if(advanceFilter.spdTo != null && advanceFilter.spdTo > 0){
appendQuery(qryStrBldr, "s <= " + advanceFilter.spdTo);
}
if(advanceFilter.brgFr != null && advanceFilter.brgFr > 0){
appendQuery(qryStrBldr, "b >= " + advanceFilter.brgFr);
}
if(advanceFilter.brgTo != null && advanceFilter.brgTo > 0){
appendQuery(qryStrBldr, "b <= " + advanceFilter.brgTo);
}
if(advanceFilter.angFr != null && advanceFilter.angFr > 0){
appendQuery(qryStrBldr, "an >= " + advanceFilter.angFr);
}
if(advanceFilter.angTo != null && advanceFilter.angTo > 0){
appendQuery(qryStrBldr, "an <= " + advanceFilter.angTo);
}
if(advanceFilter.hepeFr != null && advanceFilter.hepeFr > 0){
appendQuery(qryStrBldr, "he >= " + advanceFilter.hepeFr);
}
if(advanceFilter.hepeTo != null && advanceFilter.hepeTo > 0){
appendQuery(qryStrBldr, "he <= " + advanceFilter.hepeTo);
}
if(advanceFilter.vepeFr != null && advanceFilter.vepeFr > 0){
appendQuery(qryStrBldr, "ve >= " + advanceFilter.vepeFr);
}
if(advanceFilter.vepeTo != null && advanceFilter.vepeTo > 0){
appendQuery(qryStrBldr, "ve <= " + advanceFilter.vepeTo);
}
if(advanceFilter.tempFr != null && advanceFilter.tempFr > 0){
appendQuery(qryStrBldr, "t >= " + advanceFilter.tempFr);
}
if(advanceFilter.tempTo != null && advanceFilter.tempTo > 0){
appendQuery(qryStrBldr, "t <= " + advanceFilter.tempTo);
}
if(advanceFilter.motion != null){
appendQuery(qryStrBldr, "m = " + advanceFilter.motion);
}
if(advanceFilter.ignition != null){
appendQuery(qryStrBldr, "i = " + advanceFilter.ignition);
}
}
return qryStrBldr.toString();
}
return "";
}
catch(Exception ex){
ex.printStackTrace();
return "";
}
}
}
I am using getRideCount(Long rideId) function for fetching count. Can anyone help me in finding why it returning 0 though features exists in feature collections. or there exists other preferred techniques to fetch the matching feature count?. Any suggestion or clarifications are welcomed.
Thank You
Suresh Prajapati