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 <[email protected]> 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 <[email protected]> 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 <[email protected]
>> > <mailto:[email protected]>> 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
>> > <[email protected] <mailto:[email protected]>
>> > > <mailto:[email protected]
>> > <mailto:[email protected]>>> 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
>> > > > [email protected]
>> > <mailto:[email protected]>
>> > > <mailto:[email protected]
>> > <mailto:[email protected]>>
>> > > >
>> > 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
>> > > [email protected]
>> > <mailto:[email protected]>
>> > > <mailto:[email protected]
>> > <mailto:[email protected]>>
>> > > 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
>> > > [email protected]
>> > <mailto:[email protected]>
>> > > 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
>> > [email protected]
>> > <mailto:[email protected]>
>> > 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
>> > [email protected]
>> > 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
>> [email protected]
>> 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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel