Kralizek
14-12-2009, 13:33
Salve a tutti...
ho due strutture dati che possono essere riassunte attraverso lo schema XML presente nel primo snippet.
Finché devo fare il confronto di uguaglianza, é tutto abbastanza facile. Il problema viene quando devo ordinare una lista di di queste strutture dati secondo la somiglianza ad un dato template.
Anzi, finché non considero gli elementi "booleani" (ad eccezione del primo and che é implicito) é semplice anche comparare. Il problema é quando sia il template che le strutture dati da comparare possono rappresentare una funzione booleana (qualcosa tipo: "condizione 1 and condizione 2 and (condizione3 and not condizione 4)".
Per ora me la sono cavata con questa soluzione:
La lista da comparare invoca su ogni suo elemento un metodo che accetta il template. Ogni elemento della lista invoca a sua volta, recursivamente, un metodo che assegna un punteggio per ogni condizione rispettata.
Ho dovuto usare la ricorsione perché in questo modo, una volta rilevato un nodo "booleano", invoco la stessa funzione sui suoi figli.
Ovviamente non chiedo una soluzione completa, mi interessa piú un consulto su metodologie ed algoritmi.
Grassie a tutti e spero di essere stato abbastanza chiaro.
Schema XML:
<xs:schema targetNamespace="http://www.educations.com/Search/Parameters.xsd"
elementFormDefault="qualified"
xmlns="http://www.educations.com/Search/Parameters.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element type="parameter" name="parameter" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="parameter" abstract="true">
<xs:attribute name="required" type="xs:boolean" default="true" use="optional" />
</xs:complexType>
<xs:complexType name="or">
<xs:complexContent>
<xs:extension base="parameter">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="parameter" type="parameter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="and">
<xs:complexContent>
<xs:extension base="parameter">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="parameter" type="parameter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="not">
<xs:complexContent>
<xs:extension base="parameter">
<xs:all minOccurs="1" maxOccurs="1">
<xs:element name="parameter" type="parameter" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="place" final="extension">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="placeID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="type">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="typeID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="category">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="categoryID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="marker">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="markerID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="keywords">
<xs:complexContent>
<xs:extension base="parameter">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="keyword">
<xs:complexType>
<xs:attribute name="key" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="value" type="xs:string" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
alcuni esempi di struttura serializzata secondo lo schema:
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameter xsi:type="category" categoryID="4" />
</parameters>
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd">
<parameter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="keyword" value="fly" />
</parameters>
<!-- categoryID = 23 && placeID != 24 -->
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameter xsi:type="category" categoryID="23" />
<parameter xsi:type="place" placeID="24" />
</parameters>
<!-- categoryID = 4 && (placeID == 24 || placeID == 7) -->
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameter xsi:type="category" categoryID="4" />
<parameter xsi:type="or">
<parameter xsi:type="place" placeID="24" />
<parameter xsi:type="place" placeID="7" />
</parameters>
</parameters>
ho due strutture dati che possono essere riassunte attraverso lo schema XML presente nel primo snippet.
Finché devo fare il confronto di uguaglianza, é tutto abbastanza facile. Il problema viene quando devo ordinare una lista di di queste strutture dati secondo la somiglianza ad un dato template.
Anzi, finché non considero gli elementi "booleani" (ad eccezione del primo and che é implicito) é semplice anche comparare. Il problema é quando sia il template che le strutture dati da comparare possono rappresentare una funzione booleana (qualcosa tipo: "condizione 1 and condizione 2 and (condizione3 and not condizione 4)".
Per ora me la sono cavata con questa soluzione:
La lista da comparare invoca su ogni suo elemento un metodo che accetta il template. Ogni elemento della lista invoca a sua volta, recursivamente, un metodo che assegna un punteggio per ogni condizione rispettata.
Ho dovuto usare la ricorsione perché in questo modo, una volta rilevato un nodo "booleano", invoco la stessa funzione sui suoi figli.
Ovviamente non chiedo una soluzione completa, mi interessa piú un consulto su metodologie ed algoritmi.
Grassie a tutti e spero di essere stato abbastanza chiaro.
Schema XML:
<xs:schema targetNamespace="http://www.educations.com/Search/Parameters.xsd"
elementFormDefault="qualified"
xmlns="http://www.educations.com/Search/Parameters.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="parameters">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element type="parameter" name="parameter" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="parameter" abstract="true">
<xs:attribute name="required" type="xs:boolean" default="true" use="optional" />
</xs:complexType>
<xs:complexType name="or">
<xs:complexContent>
<xs:extension base="parameter">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="parameter" type="parameter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="and">
<xs:complexContent>
<xs:extension base="parameter">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:element name="parameter" type="parameter" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="not">
<xs:complexContent>
<xs:extension base="parameter">
<xs:all minOccurs="1" maxOccurs="1">
<xs:element name="parameter" type="parameter" />
</xs:all>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="place" final="extension">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="placeID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="type">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="typeID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="category">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="categoryID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="marker">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="markerID" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="keywords">
<xs:complexContent>
<xs:extension base="parameter">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:element name="keyword">
<xs:complexType>
<xs:attribute name="key" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="keyword">
<xs:complexContent>
<xs:extension base="parameter">
<xs:attribute name="value" type="xs:string" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
alcuni esempi di struttura serializzata secondo lo schema:
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameter xsi:type="category" categoryID="4" />
</parameters>
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd">
<parameter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="keyword" value="fly" />
</parameters>
<!-- categoryID = 23 && placeID != 24 -->
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameter xsi:type="category" categoryID="23" />
<parameter xsi:type="place" placeID="24" />
</parameters>
<!-- categoryID = 4 && (placeID == 24 || placeID == 7) -->
<parameters xmlns="http://www.educations.com/Search/Parameters.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameter xsi:type="category" categoryID="4" />
<parameter xsi:type="or">
<parameter xsi:type="place" placeID="24" />
<parameter xsi:type="place" placeID="7" />
</parameters>
</parameters>