Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[geomesa-dev] Geomesa Feature Count always returning zero!!!

Hello Everyone

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> dsConfthrows 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 = (FeatureStoresfs;

  }


  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(tableNamesimpleFeatureTypeBuilder.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.latevent.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 rideIdthrows 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 criteriathrows 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


Back to the top