/** * augmentSQL alters read requests to return the 'correct' DataObject, given the current Moderatable state setting */ function augmentSQL(SQLQuery &$query) { /* If its disjunctive, throw an error. That would mean all approved objects would be included on all queries. */ if ($query->connective == "OR") { throw new Exception("Moderatable can't filter on a disjunctive query"); } $savedstage = Versioned::$reading_stage; $stageTable = $this->baseTable($this->defaultStage); $liveTable = $this->baseTable($this->liveStage); /* Handle the 'approved' & 'approved_if_latest' selections */ if (ModeratableState::$state == 'approved' || ModeratableState::$state == 'approved_if_latest') { Versioned::$reading_stage = $this->liveStage; parent::augmentSQL($query); if (ModeratableState::$state == 'approved_if_latest') { $query->from["{$stageTable}VMVerCheck"] = "LEFT JOIN `{$stageTable}` ON `{$stageTable}`.ID = `{$liveTable}`.ID"; $query->where['VMVerCheck'] = "`{$stageTable}`.Version <= `{$liveTable}`.Version"; } } else { Versioned::$reading_stage = $this->defaultStage; parent::augmentSQL($query); if (ModeratableState::$state != 'any') { $query->where['VMSpamSplit'] = $this->where(ModeratableState::$state); $query->leftJoin($liveTable, "`{$stageTable}`.ID = `{$liveTable}`.ID"); $query->where['VMVerCheck'] = "`{$liveTable}`.Version IS NULL OR `{$stageTable}`.Version > `{$liveTable}`.Version"; } } Versioned::$reading_stage = $savedstage; }