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