public static function query($query) { $shortq = preg_replace('/\\s*/m', '', $query); if (!self::$cachedStatements[$shortq] instanceof statement) { $lexer = new lexer(); $parsedQuery = $lexer->parse($query); $statement = new statement(); $statement->setQuery($parsedQuery); $datastore = $parsedQuery->getModel()->getDatastore(); $driverclass = '\\Moya\\core\\orm\\drivers\\' . config::get('datastore', $datastore . '/driver'); $driver = $driverclass::getInstance($datastore); $statement->setDriver($driver); $statement->setCompiledquery($driver->compileQuery($parsedQuery)); echo $statement->getCompiledquery() . "\n"; self::$cachedStatements[$shortq] = $statement->prepare(); } return self::$cachedStatements[$shortq]; }
protected function parseSubselect(lexer $lexer) { $subtokens = array(); $nested = 0; $lexer->movenext(); while ($lexer->getCurrentToken() != ')' && $nested == 0) { $subtokens[] = $lexer->getCurrentToken(); $lexer->moveNext(); if ($lexer->getCurrentToken() == '(') { $nested++; } elseif ($lexer->getCurrentToken() == ')') { $nested--; } } $sublexer = new lexer(); $subquery = $sublexer->parse($subtokens); $datastore = $subquery->getModel()->getDatastore(); $driverclass = '\\Moya\\core\\orm\\drivers\\' . config::get('datastore', $datastore . '/driver'); $driver = $driverclass::getInstance($datastore); $compiledSubquery = $driver->compileQuery($subquery); //TODO subselects over different datastores; return $compiledSubquery; }