Skip to main content

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

Hi Suresh,

I've put up a PR to fix the bug with zero counts:

https://github.com/locationtech/geomesa/pull/1490

Feel free to check it out if you feel like it.

This should fix the zero count, but you will still get an estimated count (which may or may not be accurate enough for your use case). To try to debug why the exact counts are taking so long, you can still try the explain logging from my first email.

Thanks,

Emilio

On 04/25/2017 09:23 AM, Emilio Lahr-Vivaz wrote:
Hmm, looking into our cached stats calculations, I think there is a bug when there is no date field for the data. This may be why you're getting 0 back for the estimated count. Let me look into it some more.

Thanks,

Emilio

On 04/25/2017 06:16 AM, Suresh Prajapati wrote:
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



_______________________________________________
geomesa-dev mailing list
geomesa-dev@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.locationtech.org/mailman/listinfo/geomesa-dev



_______________________________________________
geomesa-dev mailing list
geomesa-dev@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.locationtech.org/mailman/listinfo/geomesa-dev


Back to the top