Änderungen an der Klasse ItemCollection

Gesperrt
devils.fist
Beiträge: 24
Registriert: Fr 5. Aug 2005, 10:20
Wohnort: Wolfsburg
Kontaktdaten:

Änderungen an der Klasse ItemCollection

Beitrag von devils.fist » Di 14. Feb 2006, 11:37

Habe mal wieder etwas angepasst. Es bezieht sich auf die Version 4.5.0 alpha (steht zumindest in der Setuproutine). Ich kann daher nicht sagen ob das Problem bei späteren Versionen weiterhin besteht.

Und zwar ist es nicht möglich bei einer Klasse, die von ItemCollection abgeleitet ist, bei einer Gruppenbedingung mehrere Where's des gleichen Feldes einzutragen.

Beispiel:

Bei einer Suche über die Datenbestände gibt der User "x y" für Feld z ein.
Jetzt will ich natürlich nicht nur prüfen, ob "z like '%x y%'", sondern
"z like '%x%' and z like '%y%'".

Allerdings wird nur die zuletzt eingestellte Bedingung für z ausgeführt.
Sprich, das SQL Statement, das erzeugt wird, hat nur "z like '%y%'".

Meine Änderung, um das zu beseitigen sieht wie folgt aus:

Code: Alles auswählen

   function setWhereGroup ($group, $field, $restriction, $operator = "=")
   {
      $field = strtolower($field);
      if (!isset($this->_groupCounter[$group]))
         $this->_groupCounter[$group] = 0;

      $this->_where["groups"][$group][$this->_groupCounter[$group]]["operator"] = $operator;
      $this->_where["groups"][$group][$this->_groupCounter[$group]]["restriction"] = $restriction;
      $this->_where["groups"][$group][$this->_groupCounter[$group]]["field"] = $field;
      $this->_groupCounter[$group]++;
   }

   function _buildGroupWhereStatements()
   {
      $wheres = array();
      $groupwhere = array();

      $lastgroup = false;
      $groupwherestatement = "";

      /* Find out if there are any defined groups */
      if (count($this->_where["groups"]) > 0)
      {
         /* Step trough all groups */
         foreach ($this->_where["groups"] as $groupname => $group)
         {
            $wheres = array();

            /* Fetch restriction, fields and operators and build single group where statements */
            foreach ($group as $cnt => $item)
            {
               $restriction = "'" . $this->_itemClassInstance->_inFilter($item["restriction"]) . "'";
               $wheres[] = implode(" ", array($item["field"], $item["operator"], $restriction));
            }

            /* Add completed substatements */
            $operator = 'AND';
            if (array_key_exists($groupname, $this->_innerGroupConditions))
            {
               $operator = $this->_innerGroupConditions[$groupname];
            }
            $groupwhere[$groupname] = implode(" ".$operator." ", $wheres);
         }
      }

      /* Combine groups */
      foreach ($groupwhere as $groupname => $group)
      {
         if ($lastgroup != false)
         {
            $operator = "AND";
            /* Check if there's a group condition */
            if (array_key_exists($groupname, $this->_groupConditions))
            {
               if (array_key_exists($lastgroup, $this->_groupConditions[$groupname]))
               {
                  $operator = $this->_groupConditions[$groupname][$lastgroup];
               }
            }

            /* Reverse check */
            if (array_key_exists($lastgroup, $this->_groupConditions))
            {
               if (array_key_exists($groupname, $this->_groupConditions[$lastgroup]))
               {
                  $operator = $this->_groupConditions[$lastgroup][$groupname];
               }
            }

            $groupwherestatement .= " ". $operator . " (" . $group . ")";
         }
         else
         {
            $groupwherestatement .= "(" . $group . ")";
         }

         $lastgroup = $groupname;
      }

      return ($groupwherestatement);

   }

die Funktionen können entweder direkt in der class.genericdb.php ersetzt, oder nur in den, von ItemCollection, abgeleiteten Klassen eingefügt werden, und so überladen.

Hoffe das hilft jemandem.

emergence
Beiträge: 10600
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Di 14. Feb 2006, 13:05

ähm bei einer 4.6.4 hat sich da schon was geändert...

die erste methode sieht dort so aus

Code: Alles auswählen

	function setWhereGroup($group, $field, $restriction, $operator = "=")
	{
		$field = strtolower($field);

		$this->_where["groups"][$group][$field]["operator"] = $operator;
		$this->_where["groups"][$group][$field]["restriction"] = $restriction;
	}
und bei der zweiten (function _buildGroupWhereStatements() )sieht die geänderte stelle so aus

Code: Alles auswählen

				/* Fetch restriction, fields and operators and build single group where statements */
				foreach ($group as $field => $item)
				{
					$wheres[] = $this->_driver->buildOperator($field, $item["operator"], $item["restriction"]);

				}
ob das mit den änderungen so bei einer 4.6.4 läuft ??
*** make your own tools (wishlist :: thx)

devils.fist
Beiträge: 24
Registriert: Fr 5. Aug 2005, 10:20
Wohnort: Wolfsburg
Kontaktdaten:

Beitrag von devils.fist » Di 14. Feb 2006, 13:57

Wahrscheinlich nicht, aber die Funktionalität ist trotzdem nicht gegeben.

Es müsste wohl in etwa so aussehen:

Code: Alles auswählen

function setWhereGroup($group, $field, $restriction, $operator = "=") 
{ 
   $field = strtolower($field); 
   if (!isset($this->_groupCounter[$group])) 
         $this->_groupCounter[$group] = 0;


   $this->_where["groups"][$group][$this->_groupCounter[$group]]["operator"] = $operator; 
   $this->_where["groups"][$group][$this->_groupCounter[$group]]["restriction"] = $restriction; 
   $this->_where["groups"][$group][$this->_groupCounter[$group]]["field"] = $field; 

   $this->_groupCounter[$group]++;
}
_buildGroupWhereStatements():

Code: Alles auswählen

foreach ($group as $id=> $item) 
{ 
   $wheres[] = $this->_driver->buildOperator($item["field"], $item["operator"], $item["restriction"]);
}
Ist aber nicht getestet!!!

Gesperrt