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> 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> 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> >> 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> 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>> 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>>> 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>> >> >> > > > >> >> > 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 >> >> > > >> >> > >> >> > -- >> >> > 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> >> >> > 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 >> >> >> >> >> >> >> >> >> >> ------------------------------------------------------------------------------ >> >> 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 >> > >> > >> > >> > -- >> > 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 >> > >> > >> >> >> ------------------------------------------------------------------------------ >> 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 > > > > -- > 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 > > ------------------------------------------------------------------------------ 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