Going to start a new thread to reply as the other one was getting full.

> Glancing over those docs, I don't think we'll have any problems with it. 
> It's a good 'standard' to shoot for.
Agreed; I am more interested in the tutorial part right now. We can address the 
other stuff when the code works. 
> I do have some more questions about writing-a-csv. I finally got into 
> implementing the CSVFeatureWriter and I'm not sure how to fit it into 
> ContentFeatureStore, etc. Allow me to ramble a bit..
Yep; the questions are what we need to sort out. 
> For starters, I'm working on this API:
> 
> SimpleFeatureStore.modifyFeatures(String name, Object 
> attributeValue, Filter filter).
> My understanding of that API is that the resulting csv file will contain 
> the same rows as before, in the same order, but with the specified 
> attribute updated in just those rows that match the filter. Correct?
Correct. 
>  If so, let's examine the implementation of modifyFeatures in 
> ContentFeatureStore:
> 
> FeatureWriter<SimpleFeatureType, SimpleFeature> writer = 
> getWriter(filter, WRITER_UPDATE);
> try {
> while (writer.hasNext()) {
> SimpleFeature toWrite = writer.next();
> for (int i = 0; i < type.length; i++) {
> toWrite.setAttribute(type[i], value[i]);
> }
> writer.write();
> }
> } finally {
> writer.close();
> }
> 
> It gets a FeatureWriter that, presumably, delivers just those rows that 
> match the filter. But if the writer actually writes out the modified 
> rows to a file, then you end up with just the modified rows and not the 
> rest.
The intension is to writes out the other ones as well; that is what the 
WRITER_UPDATE "flag" is for. I think writer update will apply a wrapper around 
the "raw" feature writer you have supplied.

Let me look.

Okay In ContentDataStore we have the following method:

public final FeatureWriter<SimpleFeatureType, SimpleFeature> getWriter( Query 
query, int flags ) throws IOException {
query = joinQuery( query );
query = resolvePropertyNames(query);

FeatureWriter<SimpleFeatureType, SimpleFeature> writer = getWriterInternal( 
query, flags );

//TODO: apply wrappers

//TODO: turn locking on / off
LockingManager lockingManager = getDataStore().getLockingManager();
return ((InProcessLockingManager)lockingManager).checkedWriter(writer, 
transaction);

}


See the TODO - this is the part where I need to work with you in order to pass 
test cases.

I need to add something similar to:

if ( (flags | WRITER_UPDATE) == WRITER_UPDATE ) {
writer = new FilteringFeatureWriter( writer, filter );

}

The wrapper class FilteringFeatureWriter takes care of skipping/writing any 
rows that do not need to be modified during the call to hasNext(). 
> Alternatively, the writer could operate on an in-memory structure 
> containing all the rows and not write out to a file until the whole 
> modifyFeatures is done.
That is not our style; if the user wants to load stuff into memory they can do 
that themselves, we don't want to force their hand. 
> It seems like the only way to make it work is to 
> override modifyFeatures in CSVFeatureWriter and make it work for the 
> particular limitations that CSV files require, but that seems not-great 
> either.
What do you think of the wrapping approach shown above? You could override the 
getWriter method in CSVDataStore now in order to experiment with wrappers; and 
then we could copy it into ContentFeatureStore when you are happy it works. 
There are a large number of "wrappers" like this to perform common tasks.

The previous tutorial had the details and there is a bit more the the user 
manual and javadocs.
- http://docs.geotools.org/latest/userguide/library/main/internal.html
- 
http://docs.geotools.org/latest/userguide/tutorial/advanced/abstractdatastore.html#low-level-optimisation
 (shows how the previous AbstractDataStore applied wrappers around a 
FeatureWriter)
- http://docs.geotools.org/latest/javadocs/org/geotools/data/FeatureWriter.html

In particulary:

DiffFeatureWriter - used to handle transaction stuff (this does load only the 
changes into memory - similar to what you described)
EmptyFeatureWriter - used for Filter.EXCLUDES or Query.NONE
FilteringFeatureWriter - used as you have discovered above
> 
> Suggestions?
> 
> Thanks,
> 
> Lee

-- 
Jody Garnett

------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to