/** @override */
 public function saveItems(array $itemData, EarthIT_Schema_ResourceClass $rc, array $options = array())
 {
     EarthIT_Storage_Util::defaultSaveItemsOptions($options);
     $queries = $this->sqlGenerator->makeBulkSaveQueries($itemData, $rc, $options);
     $resultRows = array();
     foreach ($queries as $q) {
         list($sql, $params) = EarthIT_DBC_SQLExpressionUtil::templateAndParamValues($q);
         if ($q->returnsStuff()) {
             $resultRows = array_merge($resultRows, $this->sqlRunner->fetchRows($sql, $params));
         } else {
             $this->sqlRunner->doQuery($sql, $params);
         }
     }
     if ($options[EarthIT_Storage_ItemSaver::RETURN_SAVED]) {
         return $this->sqlGenerator->dbExternalToSchemaItems($resultRows, $rc);
     }
 }
 public function toSql($tableSql, EarthIT_DBC_Namer $dbObjectNamer, EarthIT_DBC_ParamsBuilder $params)
 {
     static $aliasNum;
     // More properly this would be done with a join,
     // but that requires cooperation from code outside this filter.
     // Let's see if we can make this work with sub-selects...
     $table = EarthIT_DBC_SQLExpressionUtil::tableExpression($this->targetRc, $dbObjectNamer);
     $subItemTableSql = "{" . $params->newParam('t', $table) . "}";
     $subItemAlias = 'subitem' . ++$aliasNum;
     $subItemFilterSql = str_replace("\n", "\n\t", $this->targetFilter->toSql($subItemAlias, $dbObjectNamer, $params));
     $originFieldNames = $this->reference->getOriginFieldNames();
     $targetFieldNames = $this->reference->getTargetFieldNames();
     $joinConditionSqls = array();
     for ($i = 0; $i < count($targetFieldNames); ++$i) {
         $targetCol = $dbObjectNamer->getColumnName($this->targetRc, $this->targetRc->getField($targetFieldNames[$i]));
         $originCol = $dbObjectNamer->getColumnName($this->originRc, $this->originRc->getField($originFieldNames[$i]));
         $joinConditionSqls[] = "{$subItemAlias}.{" . $params->newParam('c', new EarthIT_DBC_SQLIdentifier($targetCol)) . "} = " . "{$tableSql}.{" . $params->newParam('c', new EarthIT_DBC_SQLIdentifier($originCol)) . "}";
     }
     $joinConditionSql = implode(" AND ", $joinConditionSqls);
     return "(\n" . "\tSELECT COUNT(*)\n" . "\tFROM {$subItemTableSql} AS {$subItemAlias}\n" . "\tWHERE {$subItemFilterSql} AND {$joinConditionSql}\n" . ") > 0";
 }
 public function makeSearchQuery(EarthIT_Storage_Search $search, array $options = array())
 {
     $rc = $search->getResourceClass();
     $params = array();
     $PB = new EarthIT_DBC_ParamsBuilder($params);
     $params['table'] = $this->rcTableExpression($rc);
     $conditions = $search->getFilter()->toSql('stuff', $this->dbObjectNamer, $PB);
     // TODO: only select certain fields if fieldsOfInterest given
     $selects = $this->makeDbExternalFieldValueSqls(EarthIT_Storage_Util::storableFields($rc), $rc, 'stuff', $PB);
     $selectSqls = EarthIT_Storage_Util::formatSelectComponents($selects, $PB);
     if (count($selectSqls) == 0) {
         throw new Exception("Can't select zero stuff.");
     }
     $orderBys = array();
     $comparator = $search->getComparator();
     if ($comparator instanceof EarthIT_Storage_FieldwiseComparator) {
         foreach ($comparator->getComponents() as $cc) {
             $columnName = $this->dbObjectNamer->getColumnName($rc, $rc->getField($cc->getFieldName()));
             $orderBys[] = '{' . $PB->newParam('c', new EarthIT_DBC_SQLIdentifier($columnName)) . '} ' . $cc->getDirection();
         }
     } else {
         throw new Exception("Don't know how to order based on a " . get_class($comparator));
     }
     $skip = $search->getSkip();
     $limit = $search->getLimit();
     $limitStuff = '';
     if ($limit !== null) {
         $limitStuff .= "LIMIT " . (int) $limit;
     }
     if ($skip !== null) {
         $limitStuff .= "OFFSET " . (int) $skip;
     }
     return EarthIT_DBC_SQLExpressionUtil::expression("SELECT\n\t" . implode(",\n\t", $selectSqls) . "\n" . "FROM {table} AS stuff\n" . "WHERE {$conditions}\n" . ($orderBys ? "ORDER BY " . implode(', ', $orderBys) . "\n" : '') . $limitStuff, $params);
 }
 protected function _queryRows($sql, array $params = array())
 {
     list($sql, $params) = EarthIT_DBC_SQLExpressionUtil::templateAndParamValues($sql, $params);
     return $this->sqlRunner->fetchRows($sql, $params);
 }
 protected function noise($sql, array $params)
 {
     $exp = EarthIT_DBC_SQLExpressionUtil::expression($sql, $params);
     $this->_noise(EarthIT_DBC_SQLExpressionUtil::queryToSql($exp, EarthIT_DBC_DebugSQLQuoter::getInstance()));
 }