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 &#45; New Free Runtime and 30 Day Trial
>> >      >     Check out the new simplified licensign option that enables
>> >     unlimited
>> >      >     royalty&#45;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 &#45; New Free Runtime and 30 Day Trial
>> >      > Check out the new simplified licensign option that enables
>> > unlimited
>> >      > royalty&#45;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 &#45; New Free Runtime and 30 Day Trial
>> >     Check out the new simplified licensign option that enables unlimited
>> >     royalty&#45;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 &#45; New Free Runtime and 30 Day Trial
>> > Check out the new simplified licensign option that enables unlimited
>> > royalty&#45;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 &#45; New Free Runtime and 30 Day Trial
>> Check out the new simplified licensign option that enables unlimited
>> royalty&#45;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 &#45; New Free Runtime and 30 Day Trial
> Check out the new simplified licensign option that enables unlimited
> royalty&#45;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 &#45; New Free Runtime and 30 Day Trial
Check out the new simplified licensign option that enables unlimited
royalty&#45;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

Reply via email to