Larry, can you summarize the proposed change, for the benefit of those who haven't read all 45 posts?
(Maybe JUMP needs some sort of RFC mechansim...) I don't understand your comment that "If it was per-feature overhead...". I thought this *was* implemented per-feature? If not, I really don't understand how it works. Larry Becker wrote: > We probably need to end this thread soon since it has gone on for 45 > posts now. I appreciate all of the comments and thoughts the other > developers have put into their posts. > > The most serious critique of the proposed BasicFeature mod seems to be > that it adds to the per layer memory requirements. I would like to > point out that by definition, it will take less memory per layer than > a single Feature, so this is not really much of a downside. If it was > per-feature overhead it would be a different matter entirely. > > So why should we implement BasicFeature isModified? > > 1) Because we can (the code is waiting to commit). > 2) Because it is very simple codewise. > 3) It provides useful functionality for database driver implementers. > 4) It provide useful functionality for non-database layers (select all > modified features). > > How about a vote up or down? I'd like to move on to other things. > > Larry > > On Mon, Apr 27, 2009 at 9:30 AM, Sunburned Surveyor > <sunburned.surve...@gmail.com <mailto:sunburned.surve...@gmail.com>> > wrote: > > I will do some testing when I get time. If Chris beats me to it as > part of his SoC work, he can run some testing with methods he thinks > might work best. > > SS > > On Mon, Apr 27, 2009 at 6:12 AM, Larry Becker > <becker.la...@gmail.com <mailto:becker.la...@gmail.com>> wrote: > > What can I say that I haven't already said? If you have the > code I sent > > you, I would suggest making modifications to it and see if it works. > > > > Larry > > > > On Fri, Apr 24, 2009 at 5:54 PM, Sunburned Surveyor > > <sunburned.surve...@gmail.com > <mailto:sunburned.surve...@gmail.com>> wrote: > >> > >> If we are concerned about memory we might try a single int as a > >> counter instead of using an int to count mods for each > attribute. So > >> you could do something like this: > >> > >> > >> // Private member variable to count attribute modifications. > >> private int attModCounter = 0; > >> > >> public void setAttribute() > >> { > >> // Do stuff here. > >> this.attModCounter++; > >> } > >> > >> public boolean isModified() > >> { > >> // Only return true if the modification counter is greater > than the > >> number > >> // of attributes, because each attribute is set once during > >> initialization/creation. > >> FeatureSchema schema = this.getSchema(); > >> int numOfAtts = schema.getAttributeCount(); > >> if(this.attModCounter > numOfAtts) > >> { > >> return true; > >> } > >> > >> else > >> { > >> return false; > >> } > >> } > >> > >> This will cut down on the number of ints we have to store as > counters. > >> However, if for some reason getAttribute() is called multiple > times to > >> set a single attribute value during initialization, then this > system > >> won't work. But I don't know why that would happen. > >> > >> Just a thought. > >> > >> SS > >> > >> On Fri, Apr 24, 2009 at 3:17 PM, Larry Becker > <becker.la...@gmail.com <mailto:becker.la...@gmail.com>> > >> wrote: > >> >> But there's something that could go wrong anyway, because an > attribute > >> >> has a NULL value by default and client code may decide to > not set > >> >> attributes at all if it has no value to set them to. If this > happens, > >> >> the Feature could remain not-modified for ever. > >> > > >> > This is possible, but not likely. Code like > >> > (org.openjump.sigle.plugin.joinTable.JoinTable) join() calls > >> > setAttributes > >> > with an array initialized with the attribute count. Then it > iterates > >> > through calls to setAttribute for each attribute, some of > which may be > >> > null. It would be bad practice to make the assumption that null > >> > attributes > >> > can be skipped, and I found no cases of code like this in the > main > >> > project. > >> > > >> > As far as putting the modification detection at the container > level, I'm > >> > open to the idea. I still think it should be part of the > core so that > >> > each > >> > database driver doesn't have to add its own listeners to the > already > >> > overburdened listener system. Can you sketch an outline of > how it might > >> > work? > >> > > >> > Larry > >> > > >> > On Fri, Apr 24, 2009 at 5:04 AM, Paolo Rizzi <g...@oicom.com > <mailto:g...@oicom.com>> wrote: > >> >> > >> >> Maybe it would be possibile to add explicit init methods like: > >> >> beginInit() > >> >> endInit() > >> >> > >> >> or even a single "atomic" method: > >> >> init(Object[]) > >> >> > >> >> So that mod-aware calling code could call them to let the > Feature > >> >> "know" > >> >> it is being initialized. > >> >> Still the Feature could manage a disposable int[] array so > that the > >> >> first time a setAttribute() or setAttributes() method is > called, if the > >> >> beginInit() method has been called before it means that it's > >> >> initialization time. If it has not been called but the int[] > array has > >> >> not been created, it's initialization time anyway, so it can > create the > >> >> int[] array and dispose of it as soon as all attributes have > been set > >> >> at > >> >> least once. > >> >> This way both mod-aware and non-mod-aware code would work. > >> >> > >> >> But there's something that could go wrong anyway, because an > attribute > >> >> has a NULL value by default and client code may decide to > not set > >> >> attributes at all if it has no value to set them to. If this > happens, > >> >> the Feature could remain not-modified for ever. > >> >> > >> >> I feel that the mod mechanism should require awareness by > the client > >> >> code in any case, since you have to write dirty Features out > sooner or > >> >> later, so it may not be the case to put too much burden on > the Feature > >> >> shoulders... > >> >> > >> >> Also, apart from modified Features, there're inserted and > deleted one, > >> >> that should be managed. So the Feature itself may not even > be aware at > >> >> all of it's own dirtyness. I see this information to pertain > to Feature > >> >> containers more than to Features themselves... > >> >> > >> >> Bye > >> >> Paolo > >> >> > >> >> > >> >> > I agree that a mechanism to reset the modified status is > needed, > >> >> > especially after the changes to the layer have been > flushed to the > >> >> > database. I'll add this to BasicFeature. > >> >> > > >> >> > Your comment about carrying around state data after it is > needed is > >> >> > reasonable. The code could check for modified on-the-fly > while it is > >> >> > incrementing the attribute mod count and if it is greater > than one, > >> >> > set > >> >> > a boolean instead and dispose of the array of ints. You > would lose > >> >> > the > >> >> > ability to determine individual attribute mods (not sure > if it is > >> >> > needed), however you would only save memory in modified > records which > >> >> > wouldn't usually be very much. > >> >> > > >> >> > I was hoping someone would come up with a clever hack that > wouldn't > >> >> > require the int array. All of the optimizations that I have > >> >> > considered > >> >> > break in one case or another. > >> >> > > >> >> > BTW, if you really want to save memory on attribute > storage, I have a > >> >> > number of questionable schemes that load attributes on an > as-needed > >> >> > basis. :-) SkyJUMP even has an optimization were layers > that aren't > >> >> > visible are not loaded into memory until you make them > visible, > >> >> > although > >> >> > it doesn't go as far as removing them when you make them > invisible. > >> >> > Of > >> >> > course the most famous attribute memory-saving scheme is > Michael's > >> >> > permgen attribute string scheme for dbf files. That one > saves a ton > >> >> > of > >> >> > memory on typically redundant data, until you run out of > permgen > >> >> > memory. > >> >> > > >> >> > Larry > >> >> > > >> >> > On Thu, Apr 23, 2009 at 4:06 PM, Martin Davis > >> >> > <mbda...@refractions.net <mailto:mbda...@refractions.net> > >> >> > <mailto:mbda...@refractions.net > <mailto:mbda...@refractions.net>>> wrote: > >> >> > > >> >> > re Mutating Geometry in-place - JTS discourages this, > but does > >> >> > not > >> >> > prevent it. Sometimes people do this when they are > transforming > >> >> > coordinates (eg. translation or affine transform).. > It's quite > >> >> > possible that all the JUMP code is clean, however. In > any case, > >> >> > this > >> >> > will only be an issue if that particular function is used. > >> >> > > >> >> > re tracking modifications - how about providing a > method that > >> >> > lets > >> >> > you > >> >> > clear the modified flag? Then the feature can be > constructed as > >> >> > necessary and then marked as clean. > >> >> > > >> >> > It seems heavyweight to carry around a set of data > which is only > >> >> > really > >> >> > of use during the construction phase of a Feature. To > avoid > >> >> > this, > >> >> > I'd > >> >> > even suggest constructing a Feature as needed, then > creating a > >> >> > new > >> >> > Feature from it via a constructor which sets the > modified flag > >> >> > appropriately. Anything to avoid requiring more storage. > >> >> > > >> >> > How does GeoTools handle this? > >> >> > > >> >> > Larry Becker wrote: > >> >> > > The tricky thing about modifications is not to find > a record > >> >> > is > >> >> > > modified just because you set the initial value. > It is only > >> >> > modified > >> >> > > if you set it more than once, otherwise all records > would be > >> >> > set > >> >> > as > >> >> > > modified as soon as they are loaded. > >> >> > > > >> >> > > The next trick is to consider that you call > setAttribute > >> >> > multiple > >> >> > > times with different attribute indexes, so it is > necessary to > >> >> > track > >> >> > > the changes to each one separately. > >> >> > > > >> >> > > Mutating Geometries in place is a concern. I have > never seen > >> >> > code > >> >> > > that does this, and certainly none of the edit > tools or any > >> >> > plugins > >> >> > > that use transactions do this, but it may be > possible. Could > >> >> > you > >> >> > just > >> >> > > modify the Coordinate.x and y values? I'll try to > construct a > >> >> > > Beanshell test for this, but I doubt that this is a > serious > >> >> > concern. > >> >> > > All of the tools and plugins that I have tried so > far play by > >> >> > the > >> >> > rules. > >> >> > > > >> >> > > Larry > >> >> > > > >> >> > > On Thu, Apr 23, 2009 at 2:12 PM, Martin Davis > >> >> > <mbda...@refractions.net > <mailto:mbda...@refractions.net> <mailto:mbda...@refractions.net > <mailto:mbda...@refractions.net>> > >> >> > > <mailto:mbda...@refractions.net > <mailto:mbda...@refractions.net> > >> >> > <mailto:mbda...@refractions.net > <mailto:mbda...@refractions.net>>>> wrote: > >> >> > > > >> >> > > Larry, why do you use an int rather than a > boolean to flag > >> >> > changed > >> >> > > attributes? > >> >> > > > >> >> > > BTW, In order to track changes to Geometry > attributes > >> >> > correctly, the > >> >> > > JUMP codebase needs to be scrutinized to make > sure it > >> >> > isn't > >> >> > mutating > >> >> > > Geometries "in place". > >> >> > > > >> >> > > > >> >> > > > >> >> > > Larry Becker wrote: > >> >> > > > Hi, > >> >> > > > > >> >> > > > As I mentioned in the other thread, before > the problem > >> >> > of > >> >> > partial > >> >> > > > database updates can be solved, we must first > be able to > >> >> > > determine if > >> >> > > > a Feature has been modified. This is not > currently > >> >> > possible in > >> >> > > all of > >> >> > > > the JUMP variants that I am familiar with, > although > >> >> > Kosmo > >> >> > may have > >> >> > > > implemented it. > >> >> > > > > >> >> > > > The simplest way of implementing it that I > can see is to > >> >> > modify > >> >> > > > BasicFeature to include: > >> >> > > > > >> >> > > > private int[] attributeModCount; //this is a > parallel > >> >> > array to > >> >> > > > Object[] attributes > >> >> > > > > >> >> > > > Then it would be necessary to allocate the > >> >> > attributeModCount array > >> >> > > > when setAttributes(Object[] attributes) is > called. > >> >> > > > > >> >> > > > In addition each time setAttribute(int > attributeIndex, > >> >> > Object > >> >> > > > newAttribute) is called, add the line of code: > >> >> > > > > >> >> > > > attributeModCount[attributeIndex]++ > >> >> > > > > >> >> > > > With these modifications we could then define: > >> >> > > > > >> >> > > > public boolean isFeatureModified() { > >> >> > > > for (int i=0; i<attributeModCount.length; > i++) { > >> >> > > > if (attributeModCount[i] > 1) > //modified is > >> >> > defined > >> >> > as > >> >> > > setting > >> >> > > > an attribute more than once > >> >> > > > return true; > >> >> > > > } > >> >> > > > return false; > >> >> > > > } > >> >> > > > > >> >> > > > Would this work and does this seem like > something we > >> >> > should > >> >> > > consider? > >> >> > > > > >> >> > > > regards, > >> >> > > > Larry > >> >> > > > -- > >> >> > > > http://amusingprogrammer.blogspot.com/ > >> >> > > > > >> >> > > > >> >> > > >> >> > > >> >> > > ------------------------------------------------------------------------ > >> >> > > > > >> >> > > > > >> >> > > > >> >> > > >> >> > > >> >> > > > ------------------------------------------------------------------------------ > >> >> > > > > >> >> > > > > >> >> > > > >> >> > > >> >> > > >> >> > > ------------------------------------------------------------------------ > >> >> > > > > >> >> > > > _______________________________________________ > >> >> > > > Jump-pilot-devel mailing list > >> >> > > > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net>> > >> >> > > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net>>> > >> >> > > > > >> >> > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> >> > > > > >> >> > > > >> >> > > -- > >> >> > > Martin Davis > >> >> > > Senior Technical Architect > >> >> > > Refractions Research, Inc. > >> >> > > (250) 383-3022 > >> >> > > > >> >> > > > >> >> > > > >> >> > > >> >> > > >> >> > > > ------------------------------------------------------------------------------ > >> >> > > Crystal Reports - New Free Runtime and 30 > Day Trial > >> >> > > Check out the new simplified licensign option > that enables > >> >> > unlimited > >> >> > > royalty-free distribution of the report > engine for > >> >> > externally > >> >> > > facing > >> >> > > server and web deployment. > >> >> > > http://p.sf.net/sfu/businessobjects > >> >> > > _______________________________________________ > >> >> > > Jump-pilot-devel mailing list > >> >> > > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net>> > >> >> > > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net>>> > >> >> > > > >> >> > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > -- > >> >> > > http://amusingprogrammer.blogspot.com/ > >> >> > > > >> >> > > >> >> > > >> >> > > ------------------------------------------------------------------------ > >> >> > > > >> >> > > > >> >> > > >> >> > > >> >> > > > ------------------------------------------------------------------------------ > >> >> > > Crystal Reports - New Free Runtime and 30 Day Trial > >> >> > > Check out the new simplified licensign option that > enables > >> >> > unlimited > >> >> > > royalty-free distribution of the report engine for > >> >> > externally > >> >> > facing > >> >> > > server and web deployment. > >> >> > > http://p.sf.net/sfu/businessobjects > >> >> > > > >> >> > > >> >> > > >> >> > > ------------------------------------------------------------------------ > >> >> > > > >> >> > > _______________________________________________ > >> >> > > Jump-pilot-devel mailing list > >> >> > > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net>> > >> >> > > > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> >> > > > >> >> > > >> >> > -- > >> >> > Martin Davis > >> >> > Senior Technical Architect > >> >> > Refractions Research, Inc. > >> >> > (250) 383-3022 > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > > > ------------------------------------------------------------------------------ > >> >> > Crystal Reports - New Free Runtime and 30 Day Trial > >> >> > Check out the new simplified licensign option that enables > >> >> > unlimited > >> >> > royalty-free distribution of the report engine for > externally > >> >> > facing > >> >> > server and web deployment. > >> >> > http://p.sf.net/sfu/businessobjects > >> >> > _______________________________________________ > >> >> > Jump-pilot-devel mailing list > >> >> > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > <mailto:Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net>> > >> >> > > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > -- > >> >> > http://amusingprogrammer.blogspot.com/ > >> >> > > >> >> > > >> >> > > >> >> > > ------------------------------------------------------------------------ > >> >> > > >> >> > > >> >> > > >> >> > > > ------------------------------------------------------------------------------ > >> >> > Crystal Reports - New Free Runtime and 30 Day Trial > >> >> > Check out the new simplified licensign option that enables > unlimited > >> >> > royalty-free distribution of the report engine for > externally > >> >> > facing > >> >> > server and web deployment. > >> >> > http://p.sf.net/sfu/businessobjects > >> >> > > >> >> > > >> >> > > >> >> > > ------------------------------------------------------------------------ > >> >> > > >> >> > _______________________________________________ > >> >> > Jump-pilot-devel mailing list > >> >> > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> >> > >> >> > >> >> > >> >> > >> >> > > ------------------------------------------------------------------------------ > >> >> Crystal Reports - New Free Runtime and 30 Day Trial > >> >> Check out the new simplified licensign option that enables > unlimited > >> >> royalty-free distribution of the report engine for > externally > >> >> facing > >> >> server and web deployment. > >> >> http://p.sf.net/sfu/businessobjects > >> >> _______________________________________________ > >> >> Jump-pilot-devel mailing list > >> >> Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> >> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> > > >> > > >> > > >> > -- > >> > http://amusingprogrammer.blogspot.com/ > >> > > >> > > >> > > > ------------------------------------------------------------------------------ > >> > Crystal Reports - New Free Runtime and 30 Day Trial > >> > Check out the new simplified licensign option that enables > unlimited > >> > royalty-free distribution of the report engine for > externally facing > >> > server and web deployment. > >> > http://p.sf.net/sfu/businessobjects > >> > _______________________________________________ > >> > Jump-pilot-devel mailing list > >> > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > >> > > >> > > >> > >> > >> > > ------------------------------------------------------------------------------ > >> Crystal Reports - New Free Runtime and 30 Day Trial > >> Check out the new simplified licensign option that enables > unlimited > >> royalty-free distribution of the report engine for > externally facing > >> server and web deployment. > >> http://p.sf.net/sfu/businessobjects > >> _______________________________________________ > >> Jump-pilot-devel mailing list > >> Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > >> https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > > > > > > > -- > > http://amusingprogrammer.blogspot.com/ > > > > > > ------------------------------------------------------------------------------ > > Crystal Reports - New Free Runtime and 30 Day Trial > > Check out the new simplified licensign option that enables unlimited > > royalty-free distribution of the report engine for > externally facing > > server and web deployment. > > http://p.sf.net/sfu/businessobjects > > _______________________________________________ > > Jump-pilot-devel mailing list > > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > > > > > > ------------------------------------------------------------------------------ > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensign option that enables unlimited > royalty-free distribution of the report engine for externally > facing > server and web deployment. > http://p.sf.net/sfu/businessobjects > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > <mailto:Jump-pilot-devel@lists.sourceforge.net> > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > > > > > -- > http://amusingprogrammer.blogspot.com/ > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------------ > Crystal Reports - New Free Runtime and 30 Day Trial > Check out the new simplified licensign option that enables unlimited > royalty-free distribution of the report engine for externally facing > server and web deployment. > http://p.sf.net/sfu/businessobjects > ------------------------------------------------------------------------ > > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > -- Martin Davis Senior Technical Architect Refractions Research, Inc. (250) 383-3022 ------------------------------------------------------------------------------ Crystal Reports - New Free Runtime and 30 Day Trial Check out the new simplified licensign option that enables unlimited royalty-free distribution of the report engine for externally facing server and web deployment. http://p.sf.net/sfu/businessobjects _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel