/** @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())); }