[Geoserver-devel] Re: [Geotools-gt2-users] Sorting queries on DataStore

Hi all,
it seems to be no way to specify an ordering for features returned
by a query to a DataStore.
Maybe it's because ordering is not supported in WFS either...

Is there any prevision of implementing it in GeoTools any time soon???

If not, I found these possible solutions / workarounds:
.) Create an ordered view in the RDBMS and query that (CONS: don't like it).

.) Create a WrappingDataStore capable of sorting features from a wrappee
(CONS: it's a waste of resource, since the RDBMS can sort on its own).

.) Patching XXXDataStore (for me it will be PostgisDataStore) to interpret
special "ordering" Filters putting them into an "ORDER BY" clause instead
that into the "WHERE". (CONS: it'll work only with "patched" DataSto

Looks like it's time to start some work on this. Norman was asking for
this last week. Basically I think what we want to do the work as a
special filter. I think eventually we will aim for a combination of your
2 and 3 suggestions, similar to how we handle filters in general now. We
use a SortBy filter, and if the datastore can turn it into SQL it does, if
it can't (is not an rbdms) then we do the sorting ourselves in java.
Norman said he might have some people who could implement this - Paulo, if
you can help let him know. I'll present a plan of action, though there
are a few places you're going to have to figure out yourselves, since it
is a special filter, so it is not as straight forward as possible.

This is going to require some API changes, but they are supported by the
new wfs and filter specs, so they should be fine.

There is a new schema in the filter package called sort.xsd:

<xsd:schema targetNamespace="http://www.opengis.net/ogc&quot;
elementFormDefault="qualified" version="1.1.0">
  <xsd:include schemaLocation="expr.xsd"/>
<!-- ============================================= -->
<!-- SORTBY EXPRESSION -->
<!-- ============================================= -->
  <xsd:element name="SortBy" type="ogc:SortByType"/>
<!-- ============================================= -->
<!-- COMPLEX TYPES -->
<!-- ============================================= -->
  <xsd:complexType name="SortByType">
     <xsd:sequence>
         <xsd:element name="SortProperty" type="ogc:SortPropertyType"
                      maxOccurs="unbounded"/>
      </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="SortPropertyType">
  <xsd:sequence>
           <xsd:element ref="ogc:PropertyName"/>
                <xsd:element name="SortOrder" type="ogc:SortOrderType"
                             minOccurs="0"/>
         </xsd:sequence>
  </xsd:complexType>
  <xsd:simpleType name="SortOrderType">
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="DESC"/>
          <xsd:enumeration value="ASC"/>
        </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

(this is publically available in the ebRim profile for catalog spec).

In the WFS spec it will be added to the Query, as an element just like
Filter, PropertyName, etc.

We should add it in a similar manner to geotools. A few classes will need
to be added/modified.

1) A new SortBy class. Following the ogc schemas would indicate this
should _not_ actually be a filter, but should use the same propertyName
element as Filter - an Expression, for us:
http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/AttributeExpression.java

So the class should just model the xml schema for sort.xsd

2) Modify SQLEncoder to accept a SortBy class (add a visit method with
SortBy as the class). I believe this should be at the same level of
filter or Expression. I am not sure if orderedBy is a standard SQL
construct - if it is then put it in SQLEncoder, if it is not then each
subclass should implement.

http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/SQLEncoder.java

3) Add the SortBy type to the FilterCapabilities for SQLEncoder, so it
gets picked up. This will involve creating a type. I think we want it in
its own class, since that's the way the OGC models it, similar to
ExpressionType or FilterType. And looking at the code the SortBy class
should extend the SortByType, to follow the rest of the Filter package.

http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/ExpressionType.java
http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/FilterType.java

4) Figure out where the DataStore should ask for the SortBy. My guess
is to use the SQLBuilder, and add an orderedBy method, along the lines of
the where method. And add the SortBy argument to the buildSQLQuery.
Be sure to handle null SortBy's. This method should just ask the encoder
to encode the SQL statement, and add it on.

5) Modify the Query (and DefaultQuery) class to have a SortBy member.
Modify the datastore to pass the SortBy off to the sql builder when it
requests its reader.

http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/data/Query.java

6) Figure out what to do if the DataStore does not support a SortBy.
Initially just throwing an exception is fine (be sure to make sure the
datastore is checking to see if it is supported - by checking the filter
capabilities (note I'm not 100% sure that it should go in
FilterCapabilities - perhaps it should be its own capability, but that's
the place I would try it out first)). But we also should look into
handling the sorting in Java, like we do with filters. In filters the
Impl class can perform the process, see
http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/GeometryFilterImpl.java
the contains method. Perhaps the sortby should have a sort method or some
such. Should probably leverage java comparable stuff, maybe it could
change the way the compareTo method of a Feature is done, so as to utilize
the SortBy the user has set (which propertyName and ascending or
descending order). Then we could just call Collections.sort(List) or some
such on the FeatureCollection (would have to bring our FeatureList
construct into effect, and this would have a nasty overhead since we'd
need to load everything in memory, but it is something that we should
eventually implement).

Ok I believe this should be sufficient for getting things working in
GeoTools.

There are a few more things to get it in GeoServer -

1) Make a SAX parser for the new SortBy element. This is probably trivial
enough to just do inside the FeatureHandler:
http://svn.refractions.net/geoserver/trunk/geoserver/src/org/vfny/geoserver/requests/wfs/FeatureHandler.java
Though it could also be done as its own (sax)handler, in which case it
could go into GeoTools, but I think that would just cause nasty weird
stacks, like what we had to do with Features and Filters and their parents
in geoserver. Basically this all needs to be moved to the new xml
framework that David Z has done. And SortBy probably needs to be added to
it. I still have not dug fully into it, but I am pretty positive it is
the answer to our problems.

I think that's actually all that is needed in GeoServer.

I will put all of this in a JIRA task. I don't have the time to tackle,
but hopefully one of you guys can. Let me know your jira name and I can
assign the task to you, and you can post your progress and post the new
code there when it's done. And I imagine you'll be able to get commit
rights if you'd like them, since this is a decent sized contribution. And
feel free to ping me if I missed anything or if it doesn't make sense.

best regards,

Chris

Wow, there's much more than I imagined...

Ok, I'll look into all that you pointed out and see how I can help.
Also I'll talk to my colleague Luca and see also what he can do.

What we're thinking about (expecially because that would be of much
use for us at this very moment), is to beef up the MemoryDataStore
to support ordering (and other functionality as well).
So, instead of putting the Java ordering capabilities "inside"
some SQLEncoder ancestor class, you have it available in a separate
DataStore that you can plug "above" any other one.

It also can go a little toward the direction of disconnected data access,
like DataSets in .NET or Delphi:
  .) connect to the "real" DataStore
  .) "download" the data you are interested in
  .) work upon it locally
  .) update any modification
Ok, that would also require some kind of persistence (maybe from
a GMLDataStore), but it's just to give the idea...

Bye
Paolo

Hi all,
it seems to be no way to specify an ordering for features returned
by a query to a DataStore.
Maybe it's because ordering is not supported in WFS either...

Is there any prevision of implementing it in GeoTools any time soon???

If not, I found these possible solutions / workarounds:
.) Create an ordered view in the RDBMS and query that (CONS: don't like

it).

.) Create a WrappingDataStore capable of sorting features from a wrappee
(CONS: it's a waste of resource, since the RDBMS can sort on its own).

.) Patching XXXDataStore (for me it will be PostgisDataStore) to interpret
special "ordering" Filters putting them into an "ORDER BY" clause instead
that into the "WHERE". (CONS: it'll work only with "patched" DataSto

Looks like it's time to start some work on this. Norman was asking for

this last week. Basically I think what we want to do the work as a
special filter. I think eventually we will aim for a combination of your

2 and 3 suggestions, similar to how we handle filters in general now. We

use a SortBy filter, and if the datastore can turn it into SQL it does,

if

it can't (is not an rbdms) then we do the sorting ourselves in java.
Norman said he might have some people who could implement this - Paulo,

if

you can help let him know. I'll present a plan of action, though there

are a few places you're going to have to figure out yourselves, since it

is a special filter, so it is not as straight forward as possible.

This is going to require some API changes, but they are supported by the

new wfs and filter specs, so they should be fine.

There is a new schema in the filter package called sort.xsd:

<xsd:schema targetNamespace="http://www.opengis.net/ogc&quot;
elementFormDefault="qualified" version="1.1.0">
<xsd:include schemaLocation="expr.xsd"/>
<!-- ============================================= -->
<!-- SORTBY EXPRESSION -->
<!-- ============================================= -->
<xsd:element name="SortBy" type="ogc:SortByType"/>
<!-- ============================================= -->
<!-- COMPLEX TYPES -->
<!-- ============================================= -->
<xsd:complexType name="SortByType">
    <xsd:sequence>
        <xsd:element name="SortProperty" type="ogc:SortPropertyType"
                     maxOccurs="unbounded"/>
     </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SortPropertyType">
<xsd:sequence>
          <xsd:element ref="ogc:PropertyName"/>
               <xsd:element name="SortOrder" type="ogc:SortOrderType"
                            minOccurs="0"/>
        </xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="SortOrderType">
       <xsd:restriction base="xsd:string">
         <xsd:enumeration value="DESC"/>
         <xsd:enumeration value="ASC"/>
       </xsd:restriction>
</xsd:simpleType>
</xsd:schema>

(this is publically available in the ebRim profile for catalog spec).

In the WFS spec it will be added to the Query, as an element just like
Filter, PropertyName, etc.

We should add it in a similar manner to geotools. A few classes will need

to be added/modified.

1) A new SortBy class. Following the ogc schemas would indicate this
should _not_ actually be a filter, but should use the same propertyName

element as Filter - an Expression, for us:
http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/AttributeExpression.java

So the class should just model the xml schema for sort.xsd

2) Modify SQLEncoder to accept a SortBy class (add a visit method with
SortBy as the class). I believe this should be at the same level of
filter or Expression. I am not sure if orderedBy is a standard SQL
construct - if it is then put it in SQLEncoder, if it is not then each
subclass should implement.

http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/SQLEncoder.java

3) Add the SortBy type to the FilterCapabilities for SQLEncoder, so it
gets picked up. This will involve creating a type. I think we want it

in

its own class, since that's the way the OGC models it, similar to
ExpressionType or FilterType. And looking at the code the SortBy class

should extend the SortByType, to follow the rest of the Filter package.

http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/ExpressionType.java
http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/FilterType.java

4) Figure out where the DataStore should ask for the SortBy. My guess
is to use the SQLBuilder, and add an orderedBy method, along the lines of

the where method. And add the SortBy argument to the buildSQLQuery.
Be sure to handle null SortBy's. This method should just ask the encoder

to encode the SQL statement, and add it on.

5) Modify the Query (and DefaultQuery) class to have a SortBy member.
Modify the datastore to pass the SortBy off to the sql builder when it
requests its reader.

http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/data/Query.java

6) Figure out what to do if the DataStore does not support a SortBy.
Initially just throwing an exception is fine (be sure to make sure the
datastore is checking to see if it is supported - by checking the filter

capabilities (note I'm not 100% sure that it should go in
FilterCapabilities - perhaps it should be its own capability, but that's

the place I would try it out first)). But we also should look into
handling the sorting in Java, like we do with filters. In filters the
Impl class can perform the process, see
http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/GeometryFilterImpl.java
the contains method. Perhaps the sortby should have a sort method or some

such. Should probably leverage java comparable stuff, maybe it could
change the way the compareTo method of a Feature is done, so as to utilize

the SortBy the user has set (which propertyName and ascending or
descending order). Then we could just call Collections.sort(List) or some

such on the FeatureCollection (would have to bring our FeatureList
construct into effect, and this would have a nasty overhead since we'd
need to load everything in memory, but it is something that we should
eventually implement).

Ok I believe this should be sufficient for getting things working in
GeoTools.

There are a few more things to get it in GeoServer -

1) Make a SAX parser for the new SortBy element. This is probably trivial

enough to just do inside the FeatureHandler:
http://svn.refractions.net/geoserver/trunk/geoserver/src/org/vfny/geoserver/requests/wfs/FeatureHandler.java
Though it could also be done as its own (sax)handler, in which case it
could go into GeoTools, but I think that would just cause nasty weird
stacks, like what we had to do with Features and Filters and their parents

in geoserver. Basically this all needs to be moved to the new xml
framework that David Z has done. And SortBy probably needs to be added

to

it. I still have not dug fully into it, but I am pretty positive it is

the answer to our problems.

I think that's actually all that is needed in GeoServer.

I will put all of this in a JIRA task. I don't have the time to tackle,

but hopefully one of you guys can. Let me know your jira name and I can

assign the task to you, and you can post your progress and post the new

code there when it's done. And I imagine you'll be able to get commit
rights if you'd like them, since this is a decent sized contribution. And

feel free to ping me if I missed anything or if it doesn't make sense.

best regards,

Chris

__________________________________________________________________
Tiscali Adsl 3 Mega Flat, 3 MESI GRATIS!
Con Tiscali Adsl 3 Mega Flat navighi in Rete alla supervelocita'
a soli 29.95 euro al mese senza limiti di tempo. Attivati entro
il 28 Febbraio 2005, 3 MESI sono GRATIS
Scopri come http://abbonati.tiscali.it/adsl/sa/2flat_tc/

Wow, there's much more than I imagined...

Ok, I'll look into all that you pointed out and see how I can help.
Also I'll talk to my colleague Luca and see also what he can do.

It's actually not that much, I just went into a lot of detail, to make it
easier to figure out.

What we're thinking about (expecially because that would be of much
use for us at this very moment), is to beef up the MemoryDataStore
to support ordering (and other functionality as well).
So, instead of putting the Java ordering capabilities "inside"
some SQLEncoder ancestor class, you have it available in a separate
DataStore that you can plug "above" any other one.

That could be interesting. And actually, smarter, since the only way to
do ordering, as far as I can figure, is to do it in memory, which loses
the streaming nature of a datastore. I would love to see this work done
in GeoTools, and could probably get you commit rights, so you can work
directly there... Let me know when you have something to show.

It also can go a little toward the direction of disconnected data access,
like DataSets in .NET or Delphi:
  .) connect to the "real" DataStore
  .) "download" the data you are interested in
  .) work upon it locally
  .) update any modification
Ok, that would also require some kind of persistence (maybe from
a GMLDataStore), but it's just to give the idea...

Yeah, we are working towards that. The best bet for persistance that
we're going towards is to use a hsql database. You actually might look
into it, talk to Jody about collaborating. It is a bit nicer than memory,
since it would write to disk, could do streaming and all. You could
handle bigger datasets. It would do persistance straight from gt2
objects. And David Blasby has hsql spatially enabled, and they are
probably going to add gist indexes soon. The other reason we're pursuing
it is to handle joins - so you could load tables from two different 'real'
datastores, and then use the hsql to perform a join, a new view on it.
But yes, this is definitely the direction we want to go with geotools,
would love to have your feedback (and would love you working on 2.1, to
help push things forward, but understand that you're working against
geoserver, so we should try to push a geoserver 1.3 release out).

best regards,

Chris

Bye
Paolo

>> Hi all,
>> it seems to be no way to specify an ordering for features returned
>> by a query to a DataStore.
>> Maybe it's because ordering is not supported in WFS either...
>>
>> Is there any prevision of implementing it in GeoTools any time soon???
>>
>> If not, I found these possible solutions / workarounds:
>> .) Create an ordered view in the RDBMS and query that (CONS: don't like
>it).
>>
>> .) Create a WrappingDataStore capable of sorting features from a wrappee
>> (CONS: it's a waste of resource, since the RDBMS can sort on its own).
>>
>> .) Patching XXXDataStore (for me it will be PostgisDataStore) to interpret
>> special "ordering" Filters putting them into an "ORDER BY" clause instead
>> that into the "WHERE". (CONS: it'll work only with "patched" DataSto
>
>Looks like it's time to start some work on this. Norman was asking for

>this last week. Basically I think what we want to do the work as a
>special filter. I think eventually we will aim for a combination of your
>
>2 and 3 suggestions, similar to how we handle filters in general now. We
>
>use a SortBy filter, and if the datastore can turn it into SQL it does,
if
>
>it can't (is not an rbdms) then we do the sorting ourselves in java.
>Norman said he might have some people who could implement this - Paulo,
if
>
>you can help let him know. I'll present a plan of action, though there

>are a few places you're going to have to figure out yourselves, since it
>
>is a special filter, so it is not as straight forward as possible.
>
>This is going to require some API changes, but they are supported by the
>
>new wfs and filter specs, so they should be fine.
>
>There is a new schema in the filter package called sort.xsd:
>
><xsd:schema targetNamespace="http://www.opengis.net/ogc&quot;
>elementFormDefault="qualified" version="1.1.0">
> <xsd:include schemaLocation="expr.xsd"/>
><!-- ============================================= -->
><!-- SORTBY EXPRESSION -->
><!-- ============================================= -->
> <xsd:element name="SortBy" type="ogc:SortByType"/>
><!-- ============================================= -->
><!-- COMPLEX TYPES -->
><!-- ============================================= -->
> <xsd:complexType name="SortByType">
> <xsd:sequence>
> <xsd:element name="SortProperty" type="ogc:SortPropertyType"
> maxOccurs="unbounded"/>
> </xsd:sequence>
> </xsd:complexType>
> <xsd:complexType name="SortPropertyType">
> <xsd:sequence>
> <xsd:element ref="ogc:PropertyName"/>
> <xsd:element name="SortOrder" type="ogc:SortOrderType"
> minOccurs="0"/>
> </xsd:sequence>
> </xsd:complexType>
> <xsd:simpleType name="SortOrderType">
> <xsd:restriction base="xsd:string">
> <xsd:enumeration value="DESC"/>
> <xsd:enumeration value="ASC"/>
> </xsd:restriction>
> </xsd:simpleType>
></xsd:schema>
>
>(this is publically available in the ebRim profile for catalog spec).
>
>In the WFS spec it will be added to the Query, as an element just like
>Filter, PropertyName, etc.
>
>We should add it in a similar manner to geotools. A few classes will need
>
>to be added/modified.
>
>1) A new SortBy class. Following the ogc schemas would indicate this
>should _not_ actually be a filter, but should use the same propertyName

>element as Filter - an Expression, for us:
>http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/AttributeExpression.java
>
>So the class should just model the xml schema for sort.xsd
>
>2) Modify SQLEncoder to accept a SortBy class (add a visit method with
>SortBy as the class). I believe this should be at the same level of
>filter or Expression. I am not sure if orderedBy is a standard SQL
>construct - if it is then put it in SQLEncoder, if it is not then each
>subclass should implement.
>
>http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/SQLEncoder.java
>
>3) Add the SortBy type to the FilterCapabilities for SQLEncoder, so it
>gets picked up. This will involve creating a type. I think we want it
in
>
>its own class, since that's the way the OGC models it, similar to
>ExpressionType or FilterType. And looking at the code the SortBy class

>should extend the SortByType, to follow the rest of the Filter package.
>
>http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/ExpressionType.java
>http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/FilterType.java
>
>4) Figure out where the DataStore should ask for the SortBy. My guess
>is to use the SQLBuilder, and add an orderedBy method, along the lines of
>
>the where method. And add the SortBy argument to the buildSQLQuery.
>Be sure to handle null SortBy's. This method should just ask the encoder
>
>to encode the SQL statement, and add it on.
>
>5) Modify the Query (and DefaultQuery) class to have a SortBy member.
>Modify the datastore to pass the SortBy off to the sql builder when it
>requests its reader.
>
>http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/data/Query.java
>
>6) Figure out what to do if the DataStore does not support a SortBy.
>Initially just throwing an exception is fine (be sure to make sure the
>datastore is checking to see if it is supported - by checking the filter
>
>capabilities (note I'm not 100% sure that it should go in
>FilterCapabilities - perhaps it should be its own capability, but that's
>
>the place I would try it out first)). But we also should look into
>handling the sorting in Java, like we do with filters. In filters the
>Impl class can perform the process, see
>http://svn.refractions.net/geotools/geotools/trunk/gt/module/main/src/org/geotools/filter/GeometryFilterImpl.java
>the contains method. Perhaps the sortby should have a sort method or some
>
>such. Should probably leverage java comparable stuff, maybe it could
>change the way the compareTo method of a Feature is done, so as to utilize
>
>the SortBy the user has set (which propertyName and ascending or
>descending order). Then we could just call Collections.sort(List) or some
>
>such on the FeatureCollection (would have to bring our FeatureList
>construct into effect, and this would have a nasty overhead since we'd
>need to load everything in memory, but it is something that we should
>eventually implement).
>
>Ok I believe this should be sufficient for getting things working in
>GeoTools.
>
>There are a few more things to get it in GeoServer -
>
>1) Make a SAX parser for the new SortBy element. This is probably trivial
>
>enough to just do inside the FeatureHandler:
>http://svn.refractions.net/geoserver/trunk/geoserver/src/org/vfny/geoserver/requests/wfs/FeatureHandler.java
>Though it could also be done as its own (sax)handler, in which case it
>could go into GeoTools, but I think that would just cause nasty weird
>stacks, like what we had to do with Features and Filters and their parents
>
>in geoserver. Basically this all needs to be moved to the new xml
>framework that David Z has done. And SortBy probably needs to be added
to
>
>it. I still have not dug fully into it, but I am pretty positive it is

>the answer to our problems.
>
>I think that's actually all that is needed in GeoServer.
>
>I will put all of this in a JIRA task. I don't have the time to tackle,
>
>but hopefully one of you guys can. Let me know your jira name and I can
>
>assign the task to you, and you can post your progress and post the new

>code there when it's done. And I imagine you'll be able to get commit
>rights if you'd like them, since this is a decent sized contribution. And
>
>feel free to ping me if I missed anything or if it doesn't make sense.
>
>
>best regards,
>
>Chris
>
>
>

__________________________________________________________________
Tiscali Adsl 3 Mega Flat, 3 MESI GRATIS!
Con Tiscali Adsl 3 Mega Flat navighi in Rete alla supervelocita'
a soli 29.95 euro al mese senza limiti di tempo. Attivati entro
il 28 Febbraio 2005, 3 MESI sono GRATIS
Scopri come http://abbonati.tiscali.it/adsl/sa/2flat_tc/

--

An HSQLDataStore really seems a great idea!!! Why struggle to put sorting
capabilities into the MemoryDataStore when using HSQL you already have them???
I don't exactly know the memory footprint and the performances of HSQL
compared to the MemoryDataStore, but it seems the right direction.

Also the HSQLDataStore could be useful simply as a cache. For example
we'll probably have DataStores connected to external sources (like DB's in
remote offices, or via WFS). Using HSQL as a cache we could "download"
the remote data and then use it locally, without the need to explicitely
store it in PostGIS or some other mean. We could do the same thing
with a MemoryDataStore, but with less functionality.

Next week I will talk about it with my collague Luca (this week he's away
playing drums with his band for their new CD).

As for the 2.1 matter we also would like to work with it, also because another
collague, Gabriele, is working on a client application using the WFSDataStore,
hence the 2.1 version.

Bye
Paolo Rizzi

__________________________________________________________________
Tiscali Adsl 3 Mega Flat, 3 MESI GRATIS!
Con Tiscali Adsl 3 Mega Flat navighi in Rete alla supervelocita'
a soli 29.95 euro al mese senza limiti di tempo. Attivati entro
il 28 Febbraio 2005, 3 MESI sono GRATIS
Scopri come http://abbonati.tiscali.it/adsl/sa/2flat_tc/