protected function migratePrimaryImage()
 {
     $elements = $this->ElementService->findAllWithAspect('@mixin-primary-image');
     $this->TransactionManager->commit();
     $step = 200;
     foreach ($elements as $element) {
         echo "Migrate element [{$element->Slug}]\n";
         for (;;) {
             $q = new NodeQuery();
             $q->setParameter('Elements.in', $element->Slug)->setParameter('OutTags.exist', '#primary-media')->setParameter('OutTags.select', '#primary-media')->setLimit($step);
             $q = $this->NodeService->findAll($q);
             if (!$q->hasResults()) {
                 echo "No more results\n";
                 break;
             }
             $this->TransactionManager->begin();
             foreach ($q->getResults() as $node) {
                 $mediaNode = $node->getOutTag('#primary-media')->TagLinkNode;
                 $node->removeOutTags('#primary-media');
                 if (!$mediaNode->Element->hasAspect('@images')) {
                     echo "Linked node does not have @images.\n";
                     continue;
                 } else {
                     $node->addOutTag(new Tag($mediaNode->NodeRef, null, '#primary-image'));
                 }
                 echo "Updating node [{$node->NodeRef}]\n";
                 $this->NodeService->edit($node);
             }
             $this->TransactionManager->commit();
         }
     }
     echo "Done.\n";
 }
 public function preEdit(NodeRef $nodeRef, Node $node)
 {
     // node has no file
     if (!($originalFileTag = $node->getOutTag('#original'))) {
         return;
     }
     // node already has thumbnails that are going to be added
     if ($node->hasOutTags('#thumbnails')) {
         return;
     }
     $q = new NodeQuery();
     $q->setParameter('Elements.in', $nodeRef->Element->Slug)->setParameter('Slugs.in', $nodeRef->Slug)->setParameter('OutTags.exist', '#thumbnails')->setParameter('Count.only', true);
     // already has thumbnails
     if ($this->NodeService->findAll($q)->getTotalRecords()) {
         return;
     }
     $file = $this->FileService->retrieveFileFromNode($nodeRef->Element, new NodeRef($this->ElementService->getBySlug($originalFileTag->TagElement), $originalFileTag->TagSlug));
     if (!$file) {
         throw new ThumbnailsException('Could not retrieve original file!');
     }
     $originalFilePath = $file->getLocalPath();
     $thumbnailFileNodes = $this->ImageService->createInitialThumbnails($node, $originalFilePath);
     $newThumbnailTags = array();
     foreach ($thumbnailFileNodes as $size => $thumbnailFileNode) {
         $tag = new Tag($thumbnailFileNode->getElement()->getSlug(), $thumbnailFileNode->Slug, '#thumbnails', $size, $size);
         $newThumbnailTags[] = $tag;
     }
     $node->replaceOutTags('#thumbnails', $newThumbnailTags);
 }
 protected function reindexAll()
 {
     $nq = new NodeQuery();
     $nq->setParameter('Elements.in', $this->Index->getElements());
     $nq->setParameter('NodeRefs.only', true);
     $all = $this->NodeService->findAll($nq)->getResults();
     foreach ($all as $nodeRef) {
         $this->Index->reindex($nodeRef);
     }
 }
 /**
  * sets the meta where params that exist in the calling
  * template on the node query.
  *
  * @param NodeQuery $nq
  */
 private function setMetaWhereParams(NodeQuery $nq)
 {
     foreach ($this->templateVars as $name => $value) {
         if (strpos($name, '#') === 0) {
             $nq->setParameter($name, $value);
         }
     }
 }
 protected function go()
 {
     if (!isset($this->Index)) {
         throw new Exception('Missing property Index on node search controller');
     }
     $dto = new NodeQuery();
     if ($this->getTemplateVariable('Site.all') == null) {
         if ($this->getTemplateVariable('Sites.in') == null) {
             $site = $this->RequestContext->getSite();
             $dto->setParameter('Sites.in', $site->getSlug());
         }
         $this->passthruTemplateVariable($dto, 'Sites.in');
         //            $this->passthruTemplateVariable($dto, 'SiteIDs.in');
     }
     if ($this->getTemplateVariable('Elements.in') == null) {
         $dto->setParameter('Elements.in', $this->Index->getElements());
     }
     $this->passthruTemplateVariable($dto, 'Elements.in');
     $dto->setParameter('Status.isActive', true);
     $this->passthruTemplateVariable($dto, 'SearchKeywords');
     $this->passthruTemplateVariable($dto, 'SearchThreshold');
     $this->passthruTemplateVariable($dto, 'Meta.select');
     $this->passthruTemplateVariable($dto, 'OutTags.select');
     $this->passthruTemplateVariable($dto, 'InTags.select');
     $this->passthruTemplateVariable($dto, 'ActiveDate.before');
     $this->passthruTemplateVariable($dto, 'ActiveDate.after');
     $this->passthruTemplateVariable($dto, 'ActiveDate.start');
     $this->passthruTemplateVariable($dto, 'ActiveDate.end');
     $this->passthruTemplateVariable($dto, 'CreationDate.before');
     $this->passthruTemplateVariable($dto, 'CreationDate.after');
     $this->passthruTemplateVariable($dto, 'CreationDate.start');
     $this->passthruTemplateVariable($dto, 'CreationDate.end');
     $this->passthruTemplateVariable($dto, 'OutTags.exist');
     $this->passthruTemplateVariable($dto, 'InTags.exist');
     $this->passthruTemplateVariable($dto, 'Meta.exist');
     return $this->readNodeQuery($this->Index->search($dto));
 }
 public function search(NodeQuery $dto)
 {
     $searchSafe = $dto->getParameter('SearchKeywords');
     $searchRaw = $dto->getParameter('SearchKeywordsRaw') == null ? preg_replace("/[\\(\\)\\/\\*\\[\\]\\?]+/", '', $searchSafe) : $dto->getParameter('SearchKeywordsRaw');
     $searchThreshold = $dto->getParameter('SearchThreshold');
     $maxresults = $dto->getParameter('SearchMaxResults') != null ? $dto->getParameter('SearchMaxResults') : 500;
     $sortCol = $dto->getParameter('SearchSort') != null ? $dto->getParameter('SearchSort') : 'relevance';
     $sortDir = $dto->getParameter('SearchSortDirection') != null ? $dto->getParameter('SearchSortDirection') : 'desc';
     //        $stopwords = array ('/\bof\b/','/\ba\b/','/\band\b/','/\bthe\b/');
     //        $s = str_replace('+','\+',$searchRaw);
     //        $s = preg_replace($stopwords,' ',$s);
     //$s = preg_replace("/\s+/",' ',$s);
     $s = preg_replace("/\\s+/", ' ', $searchRaw);
     // execute query
     $rows = $this->executeIndexQuery($this->getReadConnection(), $dto, $s, $searchSafe, $maxresults);
     if (sizeof($rows) == 0) {
         return $dto;
     }
     $datascore = $this->columnScores();
     $words = StringUtils::wordsTokenized($s);
     $scores = array();
     $sorts = array();
     $resultingNodeRefs = array();
     $preg_s = preg_quote(str_replace(array('*', '+', '-'), '', $s), '/');
     $ct = 0;
     foreach ($rows as $row) {
         $negative_match = FALSE;
         $found = array();
         if ($ct++ > $maxresults) {
             break;
         }
         $score = $row['Score'];
         if (preg_match("/^{$preg_s}/i", $row['Title'])) {
             $score += 10;
         } elseif (sizeof($words) == 1 && preg_match("/\\b" . $preg_s . "/i", $row['Title'])) {
             $score += 5;
         }
         foreach ($datascore as $param => $val) {
             if (!empty($s) && !empty($row[$param]) && preg_match("/\\b" . $preg_s . "\\b/si", " " . $row[$param] . " ")) {
                 $score += $val;
             }
             $m[$param] = 0;
             foreach ($words as $word) {
                 if (preg_match("/^-(.{2,})/", $word, $m) && preg_match("/\\b{$m['1']}\\b/is", $row[$param])) {
                     $negative_match = TRUE;
                 }
                 $preg_word = preg_quote($word, '/');
                 if (!empty($word) && preg_match("/\\b{$preg_word}\\b/si", " " . $row[$param] . " ")) {
                     if (!isset($m[$param])) {
                         $m[$param] = 0;
                     }
                     $m[$param]++;
                     $found[$word] = 1;
                     $score += $val / 2;
                 }
             }
             if (isset($m[$param]) && $m[$param] == sizeof($words)) {
                 $score += $val * 3;
             }
         }
         if (sizeof($found) > 0) {
             $score = $score * (sizeof($found) / sizeof($words));
         }
         $rowElement = $this->ElementService->getByID($row['ElementID']);
         $rowSlug = $row['Slug'];
         $rowNodeRef = new NodeRef($rowElement, $rowSlug);
         $rawscores['' . $rowNodeRef] = $score;
         if (!$negative_match) {
             if (empty($searchThreshold) || $score > $searchThreshold) {
                 $resultingNodeRefs['' . $rowNodeRef] = $rowNodeRef;
                 $scores['' . $rowNodeRef] = $score;
                 $sorts['' . $rowNodeRef] = $sortCol != 'relevance' ? $row[$sortCol] : $score;
             }
         }
     }
     reset($scores);
     if (sizeof($sorts) == 0) {
         return $dto;
     }
     if (strtolower($sortDir) == 'asc') {
         asort($sorts);
     } else {
         arsort($sorts);
     }
     //        $this->Logger->debug($resultingNodeRefs);
     //        $this->Logger->debug($sorts);
     $results = ArrayUtils::arraySortUsingKeys($resultingNodeRefs, array_keys($sorts));
     $dto->setParameter('NodeRefs.in', $results);
     $dto->setParameter('NodeRefs.fullyQualified', true);
     $dto->setOrderBy('NodeRefs');
     $results = $this->NodeService->findAll($dto)->getResults();
     foreach ($results as $key => &$node) {
         $nodeRef = $node['NodeRef'];
         $node['SearchScore'] = $scores['' . $nodeRef];
         //            error_log($node['Title'].' ('.$node['SearchScore'].')');
     }
     //        $keys = array_map('strval', $sorts);
     $dto->setResults($results);
     return $dto;
 }
예제 #7
0
 public function getOrderObjects(NodeQuery $nodeQuery, $ignoreNone = false)
 {
     $nodeRefs = $nodeQuery->getParameter('NodeRefs.normalized');
     $firstElement = current($nodeRefs)->getElement();
     $offset = $nodeQuery->getOffset() != null ? $nodeQuery->getOffset() : 0;
     $limit = $nodeQuery->getLimit();
     // ORDER BYS
     $arr = array('Title', 'ActiveDate', 'CreationDate', 'SortOrder', 'TreeID');
     $default = $firstElement->getDefaultOrder();
     if (empty($default)) {
         $default = 'ActiveDate DESC';
     }
     if (count($order = explode(' ', $default)) == 2) {
         $field = $order[0];
         $direction = $order[1];
         $defaultSorts = array($field => $direction);
     }
     $dtoSorts = $nodeQuery->getOrderBys();
     if ($dtoSorts == null && !$ignoreNone) {
         $dtoSorts = $defaultSorts;
     }
     $diff = array_diff(array_keys($dtoSorts), array_keys($arr));
     $merged = array_merge($diff, $arr);
     $sorts = array_unique($merged);
     $orderObjects = array();
     $metaCount = 1;
     foreach ($sorts as $name => $column) {
         if (is_int($name)) {
             $name = $column;
         }
         if (isset($dtoSorts[$name])) {
             $direction = $dtoSorts[$name];
             if (strcasecmp($name, 'NodeRefs') === 0) {
                 //$dtoParameterToSortBy = $direction;
                 $nodeRefs = array_slice($nodeRefs, 0, $limit + $offset);
                 $orderObjects[] = new NodeOrderBy('NodeRef', $nodeRefs);
             } else {
                 if (strpos($name, '#') !== false) {
                     //$orderByMeta = new MetaPartial($name);
                     $name = substr($name, strpos($name, '#') + 1);
                     if ($firstElement->getSchema()->hasMetaDef($name)) {
                         $s = $firstElement->getSchema()->getMetaDef($name);
                         $datatype = $s->Datatype;
                         $column = "{$datatype}Value{$metaCount}";
                         $metaCount++;
                         $orderObjects[] = new NodeOrderBy($column, $direction, $name, $datatype);
                     }
                 } else {
                     $orderObjects[] = new NodeOrderBy($column, $direction);
                 }
             }
         }
     }
     return $orderObjects;
 }
예제 #8
0
 protected function fetchMaxChildTreeID(Node $myNode, TagDef $treeOriginTagDef, TagPartial $treeOriginPartial, $parentTreeID = '')
 {
     $nq = new NodeQuery();
     $nq->setParameter('Status.all', true);
     $nq->setParameter('TreeID.childOf', $parentTreeID);
     $nq->setParameter('Elements.in', $myNode->getNodeRef()->getElement()->getSlug());
     if ($treeOriginTagDef->Direction == 'out') {
         $nq->setParameter('OutTags.exist', $treeOriginPartial->toString());
     } else {
         $nq->setParameter('InTags.exist', $treeOriginPartial->toString());
     }
     $nq->setOrderBy('TreeID', 'DESC');
     $nq->setLimit(1);
     $result = $this->NodeFindAllDAO->findAll($nq, true)->getResult();
     if (!empty($result)) {
         $lastNodeTreeID = $result['TreeID'];
         // if on the same level, return blank, in order to append as first child
         if (strcmp($lastNodeTreeID, $parentTreeID) === 0) {
             //                error_log('No children, same level');
             return '';
         } else {
             if (empty($parentTreeID)) {
                 return substr($lastNodeTreeID, 0, 4);
             }
         }
         //            error_log('Last TreeID = '.$lastNodeTreeID);
         return $lastNodeTreeID;
     }
     return '';
 }
 protected function elementHasRecords($slug)
 {
     $nq = new NodeQuery();
     $nq->setParameter('Elements.in', $slug);
     //        $nq->setParameter('Status.all', true);
     $nq->setLimit(1);
     $count = $this->NodeService->findAll($nq)->getResult();
     return $count !== null;
 }
예제 #10
0
파일: Node.php 프로젝트: jarves/jarves
 /**
  * Same as getChildren but returns only visible pages and non-folder nodes
  *
  * @param  boolean $pWithFolders
  *
  * @return ObjectCollection
  */
 public function getLinks($pWithFolders = false)
 {
     if ($this->collNestedGetLinks === null) {
         if (0 < $this->getRgt()) {
             $types = $pWithFolders ? array(0, 1, 2) : array(0, 1);
             $this->collNestedGetLinks = NodeQuery::create()->childrenOf($this)->filterByVisible(1)->filterByType($types)->orderByBranch()->find();
         }
     }
     return $this->collNestedGetLinks;
 }
예제 #11
0
 public function buildMySQLQuery(DatabaseInterface $db, $tableNodeRef, $table, $tableid, NodeQuery $nodeQuery, $orderObjects, $slugs, $ids = null)
 {
     $table = $db->quoteIdentifier($table);
     $element = $tableNodeRef->getElement();
     $schema = $element->getSchema();
     $q = new Query();
     $q->SELECT('DISTINCT ' . $table . '.' . $tableid . ' as ID', true);
     $q->SELECT($table . '.Slug');
     $mTableC = 1;
     if ($nodeQuery->hasParameter('OrderByInTag')) {
         $inParts = explode(' ', $nodeQuery->getParameter('OrderByInTag'), 2);
         $partials = PartialUtils::unserializeInPartials($inParts[0]);
         foreach ($partials as $partial) {
             if ($partial->getTagElement() && $partial->getTagSlug() && $partial->getTagRole()) {
                 $tTable = $db->quoteIdentifier($this->NodeDBMeta->getInTagsTable($tableNodeRef));
                 $tClause = $this->NodeTagsDAO->getOutTagPartialClause($partial, $db, $tTable);
                 $q->SELECT("OCondTable" . $mTableC . ".SortOrder as OSortOrder{$mTableC}");
                 $q->JOIN("INNER JOIN {$tTable} as OCondTable{$mTableC} " . str_replace($tTable, 'OCondTable' . $mTableC, " ON {$table}.{$tableid} = {$tTable}.{$tableid} AND {$tClause}"));
                 $direction = array_key_exists(1, $inParts) ? $inParts[1] : 'ASC';
                 $q->ORDERBY('OCondTable' . $mTableC . '.SortOrder ' . $direction);
                 $mTableC++;
             } else {
                 throw new NodeException('Invalid OrderByInTag parameter, must be fully qualified TagPartial with element:slug#role');
             }
         }
     }
     if ($nodeQuery->hasParameter('OrderByOutTag')) {
         $outParts = explode(' ', $nodeQuery->getParameter('OrderByOutTag'), 2);
         $partials = PartialUtils::unserializeOutPartials($outParts[0]);
         foreach ($partials as $partial) {
             if ($partial->getTagElement() && $partial->getTagSlug() && $partial->getTagRole()) {
                 $tTable = $db->quoteIdentifier($this->NodeDBMeta->getOutTagsTable($tableNodeRef));
                 $tClause = $this->NodeTagsDAO->getOutTagPartialClause($partial, $db, $tTable);
                 $q->SELECT("OCondTable" . $mTableC . ".SortOrder as OSortOrder{$mTableC}");
                 $q->JOIN("INNER JOIN {$tTable} as OCondTable{$mTableC} " . str_replace($tTable, 'OCondTable' . $mTableC, " ON {$table}.{$tableid} = {$tTable}.{$tableid} AND {$tClause}"));
                 $direction = array_key_exists(1, $outParts) ? $outParts[1] : 'ASC';
                 $q->ORDERBY('OCondTable' . $mTableC . '.SortOrder ' . $direction);
                 $mTableC++;
             } else {
                 throw new NodeException('Invalid OrderByOutTag parameter, must be fully qualified TagPartial with element:slug#role');
             }
         }
     }
     $mTableC = 1;
     foreach ($orderObjects as $orderObject) {
         $column = $orderObject->getColumn();
         $direction = $orderObject->getDirection();
         //if(!in_array($column, array('ID', 'Slug')))
         //{
         if ($orderObject->isMeta()) {
             $partial = $orderObject->getOrderByMetaPartial();
             $datatype = $orderObject->getOrderByMetaDataType();
             $mTable = $this->NodeDBMeta->getMetaTable($tableNodeRef, $datatype);
             $mTableAlias = $db->quoteIdentifier($mTable . $mTableC++);
             $mTable = $db->quoteIdentifier($mTable);
             $mClause = $this->NodeMetaDAO->getMetaPartialClause(new MetaPartial($partial), $datatype, $db, $mTableAlias);
             $q->SELECT($mTableAlias . '.' . $datatype . 'Value as ' . $column);
             $q->JOIN('LEFT JOIN ' . $mTable . ' as ' . $mTableAlias . ' ON ' . $table . '.' . $tableid . ' = ' . $mTableAlias . '.' . $tableid . ' AND ' . $mClause);
             $q->ORDERBY("{$column} {$direction}");
         } else {
             if ($orderObject->isDirectional()) {
                 if (!in_array($orderObject->getColumn(), array('Title', 'Slug', 'SortOrder', 'ActiveDate', 'CreationDate', 'ModifiedDate', 'TreeID'))) {
                     throw new NodeException('Invalid ordering column [' . $orderObject->getColumn() . '], must be Title, Slug, SortOrder, ActiveDate, CreationDate, ModifiedDate, TreeID, or #meta-id');
                 }
                 if ($orderObject->getColumn() != 'Slug') {
                     $q->SELECT($table . '.' . $orderObject->getColumn());
                 }
                 $q->ORDERBY("{$table}.{$column} {$direction}");
             }
         }
         //}
     }
     // Add if clause 2/1/2010 by Craig .. Mysql seems to be doing it's job without this secondary sort.
     if (empty($orderObjects)) {
         $q->ORDERBY('ID DESC');
     }
     $q->FROM($table);
     // ID
     if (!empty($ids)) {
         if (count($ids) > 1) {
             $q->WHERE("{$table}.{$tableid} IN (" . $db->joinQuote($ids) . ")");
         } else {
             if (isset($ids[0])) {
                 $q->WHERE("{$table}.{$tableid} = {$db->quote($ids[0])}");
             }
         }
     }
     // Slug
     if (!empty($slugs)) {
         if (count($slugs) > 1) {
             $q->WHERE("{$table}.Slug IN (" . $db->joinQuote($slugs) . ")");
         } else {
             if (isset($slugs[0])) {
                 $q->WHERE("{$table}.Slug = {$db->quote($slugs[0])}");
             }
         }
     }
     // AlphaIndex
     if (($alpha = $nodeQuery->getParameter('Title.firstChar')) != null) {
         if (strtolower($alpha) == '#') {
             $q->WHERE("(ASCII(LOWER(LEFT({$table}.Title, 1))) < 65) OR (ASCII(LOWER(LEFT({$table}.Title, 1))) BETWEEN 90 AND 97) OR (ASCII(LOWER(LEFT({$table}.Title, 1))) > 122)");
         } else {
             $q->WHERE("LOWER(LEFT({$table}.Title, 1)) = {$db->quote(strtolower($alpha))}");
         }
     }
     // Title
     $this->DTOHelper->buildEqualsFilter($db, $q, $nodeQuery, 'Title.ieq', "{$table}.Title");
     $this->DTOHelper->buildReplaceFilter($db, $q, $nodeQuery, 'Title.eq', "BINARY {$table}.Title = ?");
     // TitleSearch
     $this->DTOHelper->buildReplaceFilter($db, $q, $nodeQuery, 'Title.like', "{$table}.Title LIKE ?", '%#s%');
     // ParentTreeID
     $this->DTOHelper->buildReplaceFilter($db, $q, $nodeQuery, 'TreeID.childOf', "{$table}.TreeID LIKE ?", "#s%");
     // TreeID
     $this->DTOHelper->buildEqualsFilter($db, $q, $nodeQuery, 'TreeID.eq', "{$table}.TreeID");
     // select node by Tree depth (or limit existing selection)
     if (($treeDepth = $nodeQuery->getParameter('TreeID.depth')) !== null) {
         $actualDepth = $treeDepth * 4;
         $q->orWhere("LENGTH({$table}.TreeID) = {$db->quote($actualDepth)}");
     }
     if (($treeid = $nodeQuery->getParameter('TreeID.parentOf')) != null) {
         $depth = strlen($treeid) / 4;
         if ($depth == 1) {
             $q->WHERE('1 = 0');
         } else {
             for ($i = 1; $i < $depth; ++$i) {
                 $ptreeid = substr($treeid, 0, $i * 4);
                 $q->ORWHERE("{$table}.TreeID = {$db->quote($ptreeid)}");
             }
         }
     }
     // ActiveAfter
     // ActiveBefore
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'ActiveDate.after', "{$table}.ActiveDate > ?");
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'ActiveDate.before', "{$table}.ActiveDate <= ?");
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'ActiveDate.start', "{$table}.ActiveDate >= ?", 0, 0, 0);
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'ActiveDate.end', "{$table}.ActiveDate <= ?", 23, 59, 59);
     // CreatedAfter
     // CreatedBefore
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'CreationDate.after', "{$table}.CreationDate > ?");
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'CreationDate.before', "{$table}.CreationDate <= ?");
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'CreationDate.start', "{$table}.CreationDate >= ?", 0, 0, 0);
     $this->DTOHelper->buildDateReplaceFilter($db, $q, $nodeQuery, 'CreationDate.end', "{$table}.CreationDate <= ?", 23, 59, 59);
     // Status
     if (($status = $nodeQuery->getParameter('Status.eq')) != null) {
         switch ($status) {
             case 'published':
                 $q->WHERE("{$table}.Status = 'published'");
                 break;
             case 'draft':
                 $q->WHERE("{$table}.Status = 'draft'");
                 break;
             case 'deleted':
                 $q->WHERE("{$table}.Status = 'deleted'");
                 break;
             default:
                 $q->WHERE("{$table}.Status != 'deleted'");
                 break;
         }
     } else {
         if ($nodeQuery->getParameter('Status.isActive') !== null && StringUtils::strToBool($nodeQuery->getParameter('Status.isActive')) == true) {
             $now = $this->DateFactory->newStorageDate();
             $q->WHERE("{$table}.Status = 'published' AND {$table}.ActiveDate < {$db->quote($now)}");
         } else {
             if ($nodeQuery->getParameter('Status.all') == null || StringUtils::strToBool($nodeQuery->getParameter('Status.all')) == false) {
                 $q->WHERE("{$table}.Status != 'deleted'");
             }
         }
     }
     $metaParams = $this->NodesHelper->getMetaFilters($nodeQuery);
     $tablect = 0;
     foreach ($metaParams as $mArgs) {
         list($full, $name, $operator, $value) = $mArgs;
         $def = $schema->getMetaDef($name);
         $datatype = $def->Datatype;
         $mTable = $db->quoteIdentifier($this->NodeDBMeta->getMetaTable($tableNodeRef, $datatype));
         $clause = ' ' . $db->quoteIdentifier($mTable) . '.Name = ' . $db->quote($name) . " AND ";
         if ($datatype == 'flag') {
             throw new NodeException('Unable to run meta clause on flag datatype');
         }
         if (in_array($datatype, array('text', 'blob', 'mediumtext', 'mediumblob'))) {
             throw new NodeException('Query arguments with #' . $name . ' are not supported');
         }
         switch ($operator) {
             case 'eq':
                 if ($datatype == 'varchar') {
                     $clause .= " BINARY {$db->quoteIdentifier($mTable)}.{$datatype}Value = {$db->quote($value)}";
                 } else {
                     $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value = {$db->quote($value)}";
                 }
                 break;
             case 'ieq':
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value = {$db->quote($value)}";
                 break;
             case 'like':
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value LIKE " . $db->quote('%' . $value . '%');
                 break;
             case 'before':
                 $d = $this->DateFactory->newLocalDate($value);
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value <= {$db->quote($d)}";
                 break;
             case 'after':
                 $d = $this->DateFactory->newLocalDate($value);
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value > {$db->quote($d)}";
                 break;
             case 'start':
                 $d = $this->DateFactory->newLocalDate($value);
                 $d->setTime(0, 0, 0);
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value >= {$db->quote($d)}";
                 break;
             case 'end':
                 $d = $this->DateFactory->newLocalDate($value);
                 $d->setTime(23, 59, 59);
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value <= {$db->quote($d)}";
                 break;
             case 'notEq':
                 if ($datatype == 'varchar') {
                     $clause .= " BINARY {$db->quoteIdentifier($mTable)}.{$datatype}Value != {$db->quote($value)}";
                 } else {
                     $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value != {$db->quote($value)}";
                 }
                 break;
             case 'lessThan':
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value < {$db->quote($value)}";
                 break;
             case 'lessThanEq':
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value <= {$db->quote($value)}";
                 break;
             case 'greaterThan':
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value > {$db->quote($value)}";
                 break;
             case 'greaterThanEq':
                 $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value >= {$db->quote($value)}";
                 break;
                 /*
                  * case insensitive comparison for #meta.in filtering.
                  */
             /*
              * case insensitive comparison for #meta.in filtering.
              */
             case 'in':
                 $inValues = explode(',', $value);
                 if (count($inValues) > 1) {
                     $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value IN ({$db->joinQuote($inValues)})";
                 } else {
                     if ($datatype == 'varchar') {
                         $clause .= " BINARY {$db->quoteIdentifier($mTable)}.{$datatype}Value = {$db->quote($value)}";
                     } else {
                         $clause .= " {$db->quoteIdentifier($mTable)}.{$datatype}Value = {$db->quote($value)}";
                     }
                 }
                 break;
         }
         $tablect++;
         $q->JOIN("INNER JOIN {$mTable} as CondTable{$tablect} " . str_replace($mTable, 'CondTable' . $tablect, " ON {$table}.{$tableid} = {$mTable}.{$tableid} AND {$clause}"));
     }
     // IncludesMeta
     //        if(($im = $nodeQuery->getParameter('Meta.exist')) != NULL ) {
     //            $metas       = PartialUtils::unserializeMetaPartials($im);
     //            $conditions = array();
     //            foreach($metas as $partial) {
     //                $s = $schema->getMetaDef($partial->getMetaName());
     //
     //                $datatype = $s->Datatype;
     //
     //                $mTable = $db->quoteIdentifier($this->NodeDBMeta->getMetaTable($tableNodeRef, $datatype));
     //                $mClause = $this->NodeMetaDAO->getMetaPartialClause($partial, $datatype, $db, $mTable);
     //
     //                $conditions[] = "{$table}.{$tableid} IN
     //                    (SELECT {$mTable}.{$tableid}
     //                    FROM {$mTable}
     //                    WHERE ".$mClause.")";
     ////                  $conditions[] = "EXISTS (SELECT 1 FROM {$this->model->getMetaTable()}
     ////                      WHERE {$this->model->getMetaTable()}.{$this->model->getTableID()} = {$table}.{$this->model->getTableID()}
     ////                      AND ".$partial->getTagClause($this->model->getMetaTable()).")";
     //            }
     //            if (!empty($conditions)) {
     //                $q->WHERE(join(' OR ', $conditions));
     //            }
     //
     //        }
     // IncludesAllMeta
     if (($iam = $nodeQuery->getParameter('Meta.exist')) != NULL) {
         $metas = PartialUtils::unserializeMetaPartials($iam);
         foreach ($metas as $partial) {
             $s = $schema->getMetaDef($partial->getMetaName());
             $datatype = $s->Datatype;
             $mTable = $db->quoteIdentifier($this->NodeDBMeta->getMetaTable($tableNodeRef, $datatype));
             $mClause = $this->NodeMetaDAO->getMetaPartialClause($partial, $datatype, $db, $mTable);
             $tablect++;
             $q->JOIN("INNER JOIN {$mTable} as CondTable{$tablect} " . str_replace($mTable, 'CondTable' . $tablect, " ON {$table}.{$tableid} = {$mTable}.{$tableid} AND {$mClause}"));
             //                $q->WHERE("{$table}.{$tableid} IN
             //                    (SELECT {$mTable}.{$tableid}
             //                    FROM {$mTable}
             //                    WHERE ".$mClause.")");
             //                  $this->db->WHERE("EXISTS (SELECT 1 FROM {$this->model->getMetaTable()}
             //                      WHERE {$this->model->getMetaTable()}.{$this->model->getTableID()} = {$table}.{$this->model->getTableID()}
             //                      AND ".$partial->getTagClause($this->model->getMetaTable()).")");
         }
     }
     // IncludesOutTags
     //        if(($iot = $nodeQuery->getParameter('IncludesOutTags')) != NULL ) {
     //            $tags       = PartialUtils::unserializeOutPartials($iot);
     //            $conditions = array();
     //            foreach($tags as $partial) {
     //                $tTable = $db->quoteIdentifier($this->NodeDBMeta->getOutTagsTable($tableNodeRef));
     //
     //                // TODO: need to support aspects
     //                // TODO: convert OR clauses into multiple unions
     //
     //                $tClause = $this->NodeTagsDAO->getOutTagPartialClause($partial, $tableNodeRef->getSite(), $db, $tTable);
     //
     //                $conditions[] = "{$table}.{$tableid} IN
     //                    (SELECT {$tTable}.{$tableid}
     //                    FROM {$tTable}
     //                    WHERE {$tClause})";
     ////                  $conditions[] = "EXISTS (SELECT 1 FROM {$this->model->getTagsTable()} t2
     ////                      INNER JOIN tags2 ON t2.tagid = tags2.tagid
     ////                      WHERE {$table}.{$this->model->getTableID()} = t2.{$this->model->getTableID()} AND
     ////                      ".$partial->getTagClause("tags2").")";
     //            }
     //            if (!empty($conditions)) {
     //                $q->WHERE(join(' OR ', $conditions));
     //            }
     //
     //        }
     // IncludesAllOutTags
     if (($iaot = $nodeQuery->getParameter('OutTags.exist')) != NULL) {
         $tags = PartialUtils::unserializeOutPartials($iaot);
         foreach ($tags as $partial) {
             $tTable = $db->quoteIdentifier($this->NodeDBMeta->getOutTagsTable($tableNodeRef));
             $tClause = $this->NodeTagsDAO->getOutTagPartialClause($partial, $db, $tTable);
             $tablect++;
             $q->JOIN("INNER JOIN {$tTable} as CondTable{$tablect} " . str_replace($tTable, 'CondTable' . $tablect, " ON {$table}.{$tableid} = {$tTable}.{$tableid} AND {$tClause}"));
             //                $q->WHERE( "{$table}.{$tableid} IN
             //                    (SELECT {$tTable}.{$tableid}
             //                    FROM {$tTable}
             //                    WHERE {$tClause})" );
             //                  $this->db->WHERE("EXISTS (SELECT 1 FROM {$this->model->getTagsTable()} t2
             //                      INNER JOIN tags2 ON t2.tagid = tags2.tagid
             //                      WHERE {$table}.{$this->model->getTableID()} = t2.{$this->model->getTableID()} AND
             //                      ".$partial->getTagClause("tags2").")");
         }
     }
     // IncludesInTags
     //        if(($iit = $nodeQuery->getParameter('IncludesInTags')) != NULL ) {
     //            $tags       = PartialUtils::unserializeInPartials($iit);
     //            $conditions = array();
     //            foreach($tags as $partial) {
     //                $tTable = $db->quoteIdentifier($this->NodeDBMeta->getInTagsTable($tableNodeRef));
     //                $tClause = $this->NodeTagsDAO->getInTagPartialClause($partial, $tableNodeRef->getElement(), $tableNodeRef->getSite(), $db, $tTable);
     //
     //                $conditions[] = "{$table}.{$tableid} IN
     //                    (SELECT {$tTable}.{$tableid}
     //                    FROM {$tTable}
     //                    WHERE {$tClause})";
     ////                  $conditions[] = "EXISTS (SELECT 1 FROM {$this->model->getTagsTable()} t2
     ////                      INNER JOIN tags2 ON t2.tagid = tags2.tagid
     ////                      WHERE {$table}.{$this->model->getTableID()} = t2.{$this->model->getTableID()} AND
     ////                      ".$partial->getTagClause("tags2").")";
     //            }
     //            if (!empty($conditions)) {
     //                $q->WHERE(join(' OR ', $conditions));
     //            }
     //
     //        }
     // IncludesAllInTags
     if (($iait = $nodeQuery->getParameter('InTags.exist')) != NULL) {
         $tags = PartialUtils::unserializeInPartials($iait);
         foreach ($tags as $partial) {
             $tTable = $db->quoteIdentifier($this->NodeDBMeta->getInTagsTable($tableNodeRef));
             $tClause = $this->NodeTagsDAO->getInTagPartialClause($partial, $tableNodeRef->getElement(), $db, $tTable);
             $tablect++;
             $q->JOIN("INNER JOIN {$tTable} as CondTable{$tablect} " . str_replace($tTable, 'CondTable' . $tablect, " ON {$table}.{$tableid} = {$tTable}.{$tableid} AND {$tClause}"));
             //
             //                $q->WHERE( "{$table}.{$tableid} IN
             //                    (SELECT {$tTable}.{$tableid}
             //                    FROM {$tTable}
             //                    WHERE {$tClause})" );
             //                  $this->db->WHERE("EXISTS (SELECT 1 FROM {$this->model->getTagsTable()} t2
             //                      INNER JOIN tags2 ON t2.tagid = tags2.tagid
             //                      WHERE {$table}.{$this->model->getTableID()} = t2.{$this->model->getTableID()} AND
             //                      ".$partial->getTagClause("tags2").")");
         }
     }
     return $q;
 }
예제 #12
0
 public function normalizeNodeQuery(NodeQuery $nodeQuery)
 {
     if ($nodeQuery->getParameter('NodeQuery.normalized') == null) {
         $this->Events->trigger('Node.normalizeQuery', $nodeQuery);
         $nodeQuery->setParameter('NodeQuery.normalized', true);
     }
     //
     //        if($nodeQuery->hasParameter('NodePartials.eq') && $nodeQuery->hasParameter('NodeRefs.normalized') && $nodeQuery->hasParameter('NodeRefs.fullyQualified'))
     //            return $nodeQuery;
     if (!$nodeQuery->hasParameter('NodePartials.eq')) {
         $nodeQuery->setParameter('NodePartials.eq', new NodePartials($nodeQuery->getParameter('Meta.select'), $nodeQuery->getParameter('OutTags.select'), $nodeQuery->getParameter('InTags.select')));
     }
     // NODEREFS
     if ($nodeQuery->hasParameter('NodeRefs.in')) {
         $noderefsin = $nodeQuery->getParameter('NodeRefs.in');
         if (is_string($noderefsin)) {
             $nodeRefsIn = array();
             $noderefsin = explode(',', $noderefsin);
             foreach ($noderefsin as $noderefstr) {
                 $noderef = $this->parseFromString(trim($noderefstr));
                 if (!empty($noderef)) {
                     $nodeRefsIn[] = $noderef;
                 }
             }
         } else {
             $nodeRefsIn = $noderefsin;
         }
         $nodeQuery->setParameter('NodeRefs.normalized', $nodeRefsIn);
         if (!$nodeQuery->hasParameter('NodeRefs.fullyQualified')) {
             $nodeQuery->setParameter('NodeRefs.fullyQualified', true);
         }
         return $nodeQuery;
         //            return array($nodeRefsIn, $nodePartials,
         //                $nodeQuery->hasParameter('NodeRefs.fullyQualified')?$nodeQuery->getParameter('NodeRefs.fullyQualified'):true);
     }
     $nodeRefs = array();
     if (!$nodeQuery->hasParameter('Elements.in')) {
         throw new NodeException('Unable to query nodes without Elements.in specified');
     }
     $elementSlugs = $nodeQuery->getParameter('Elements.in');
     if (!is_array($elementSlugs)) {
         $elementSlugs = StringUtils::smartExplode($elementSlugs);
     }
     //        $firstElement = null;
     $sites = array();
     if ($nodeQuery->hasParameter('Sites.in')) {
         $siteSlugs = $nodeQuery->getParameter('Sites.in');
         if (!is_array($siteSlugs)) {
             $siteSlugs = StringUtils::smartExplode($siteSlugs);
         }
         $sites = $this->SiteService->multiGetBySlug($siteSlugs);
     }
     $elements = array();
     foreach ($elementSlugs as $ek => $elementSlug) {
         if (substr($elementSlug, 0, 1) == '@') {
             $aspectSlug = substr($elementSlug, 1);
             $aspect = $this->AspectService->getBySlug($aspectSlug);
             if ($aspect->ElementMode == 'one' || $aspect->ElementMode == 'anchored') {
                 $elements = array_merge($elements, (array) $this->ElementService->findAllWithAspect($aspectSlug));
                 unset($elementSlugs[$ek]);
             } else {
                 if (!empty($sites)) {
                     foreach ((array) $sites as $site) {
                         $elements = array_merge($elements, (array) $this->ElementService->findAllWithAspect($aspectSlug, $site->getSlug()));
                     }
                 } else {
                     $elements = array_merge($elements, (array) $this->ElementService->findAllWithAspect($aspectSlug));
                 }
             }
         } else {
             $elements[] = $this->ElementService->getBySlug($elementSlug);
         }
     }
     if (empty($elements)) {
         throw new NoElementsException('No elements found for expression [' . $nodeQuery->getParameter('Elements.in') . '].');
     }
     $allFullyQualified = false;
     //        $allSites = array();
     //        if($nodeQuery->hasParameter('Sites.in')) {
     //            $siteSlugs = $nodeQuery->getParameter('Sites.in');
     //            if(!is_array($siteSlugs))
     //                $siteSlugs = StringUtils::smartExplode($siteSlugs);
     //
     //            $allSites = $this->SiteService->multiGetBySlug($siteSlugs);
     //        } else if ($nodeQuery->hasParameter('SiteIDs.in')) {
     //            $siteIDs = $nodeQuery->getParameter('SiteIDs.in');
     //            if(!is_array($siteIDs))
     //                $siteIDs = StringUtils::smartExplode($siteIDs);
     //
     //            foreach($siteIDs as $siteID)
     //                $allSites[] = $this->SiteService->getByID($siteID);
     //
     //        } else {
     //            $allSites = $this->SiteService->findAll()->getResults();
     //        }
     foreach ($elements as $element) {
         //            if($element->isAnchored() && $nodeQuery->getParameter('Elements.ignoreAnchoredSite') == null){
         //                $sites = array($element->getAnchoredSite());
         //            } else {
         //                $sites = $allSites;
         //            }
         //            foreach($sites as $site)
         //            {
         if (($slugs = $nodeQuery->getParameter('Slugs.in')) != null) {
             if (!is_array($slugs)) {
                 $slugs = StringUtils::smartExplode($slugs);
             }
             $allFullyQualified = true;
             foreach ($slugs as $slug) {
                 $nodeRefs[] = new NodeRef($element, SlugUtils::createSlug($slug, true));
             }
         } else {
             $nodeRefs[] = new NodeRef($element);
         }
         //            }
     }
     $nodeQuery->setParameter('NodeRefs.normalized', $nodeRefs);
     //if(!$nodeQuery->hasParameter('NodeRefs.fullyQualified'))
     $nodeQuery->setParameter('NodeRefs.fullyQualified', $allFullyQualified);
     //return array($nodeRefs, $nodePartials, $allFullyQualified);
     return $nodeQuery;
 }
 public function tagGalleryPhotos()
 {
     $galleryNodeRef = $this->NodeRefService->parseFromString('media-gallery:test-gallery');
     $interval = 25;
     $offset = 0;
     $nq = new NodeQuery();
     $nq->setParameter('Elements.in', 'image');
     $nq->setParameter('NodeRefs.only', true);
     $nq->setOrderBy('ActiveDate', 'DESC');
     $nq->setLimit($interval);
     $nq->setOffset($offset);
     $nq = $this->NodeService->findAll($nq, true);
     $nodes = $nq->getResults();
     while (count($nodes) > 0) {
         foreach ($nodes as $node) {
             $tag = new Tag($node->getElement()->getSlug(), $node->getSlug(), '#media-gallery-items');
             try {
                 $this->NodeService->addOutTag($galleryNodeRef, $tag);
                 echo $node->Slug . "\n";
             } catch (Exception $e) {
                 echo $node->Slug . " error: " . $e->getMessage() . "\n";
             }
         }
         $offset = $offset + $interval;
         unset($nodes);
         $nq->setLimit($interval);
         $nq->setOffset($offset);
         $nq->clearResults();
         $nq = $this->NodeService->findAll($nq, true);
         $nodes = $nq->getResults();
     }
 }
 protected function single()
 {
     $dto = new NodeQuery();
     $dto->setLimit(1);
     if ($this->getTemplateVariable('Site.all') == null) {
         if ($this->getTemplateVariable('Sites.in') == null) {
             $site = $this->RequestContext->getSite();
             $dto->setParameter('Sites.in', $site->getSlug());
         }
         $this->passthruTemplateVariable($dto, 'Sites.in');
         //$this->passthruTemplateVariable($dto, 'SiteIDs.in');
     }
     $this->passthruTemplateVariable($dto, 'Elements.in');
     //        $this->passthruTemplateVariable($dto, 'Slugs.in');
     $this->passthruTemplateVariable($dto, 'Meta.select');
     $this->passthruTemplateVariable($dto, 'OutTags.select');
     $this->passthruTemplateVariable($dto, 'InTags.select');
     //        $this->passthruTemplateVariable($dto, 'Sections.select');
     //        $this->passthruTemplateVariable($dto, 'Title.like');
     //        $this->passthruTemplateVariable($dto, 'Title.ieq');
     //        $this->passthruTemplateVariable($dto, 'Title.eq');
     //        $this->passthruTemplateVariable($dto, 'Title.firstChar');
     //
     //        if(!$this->Permissions->checkPermission('cms-view')) {
     //            $dto->setParameter('Status.isActive', true);
     //        }
     //        $this->passthruTemplateVariable($dto, 'ActiveDate.before');
     //        $this->passthruTemplateVariable($dto, 'ActiveDate.after');
     //        $this->passthruTemplateVariable($dto, 'ActiveDate.start');
     //        $this->passthruTemplateVariable($dto, 'ActiveDate.end');
     //
     //        $this->passthruTemplateVariable($dto, 'CreationDate.before');
     //        $this->passthruTemplateVariable($dto, 'CreationDate.after');
     //        $this->passthruTemplateVariable($dto, 'CreationDate.start');
     //        $this->passthruTemplateVariable($dto, 'CreationDate.end');
     //
     //        $this->passthruTemplateVariable($dto, 'OutTags.exist');
     //        $this->passthruTemplateVariable($dto, 'InTags.exist');
     //        $this->passthruTemplateVariable($dto, 'Meta.exist');
     //        $this->passthruTemplateVariable($dto, 'Sections.exist');
     //
     //        foreach($this->templateVars as $name => $value)
     //        {
     //            if(strpos($name, '#') === 0)
     //                $dto->setParameter($name, $value);
     //        }
     $slug = $this->getTemplateVariable('Slugs.in');
     if ($slug != null) {
         $dto->setParameter('Slugs.in', $slug);
         $dto = $this->NodeRefService->normalizeNodeQuery($dto);
         $nodeRefs = $dto->getParameter('NodeRefs.normalized');
         $nodePartials = $dto->getParameter('NodePartials.eq');
         $allFullyQualified = $dto->getParameter('NodeRefs.fullyQualified');
         if (!$allFullyQualified || count($nodeRefs) > 1) {
             $this->Logger->debug('node-single query is not fully-qualified NodeRef or more than 1 node is being returned');
             $dto->setResults(array());
         } else {
             $row = $this->RegulatedNodeService->getByNodeRef(current($nodeRefs), $nodePartials, $this->getTemplateVariable('ForceReadWrite') != null ? StringUtils::strToBool($this->getTemplateVariable('ForceReadWrite')) : false);
             $showPending = StringUtils::strToBool($this->getTemplateVariable('Status.allowInactive')) || $this->Permissions->checkPermission('cms-view');
             //Allow draft records to be viewed if exact URL is known.
             if (empty($row)) {
                 $this->Logger->debug('Row not found');
                 $dto->setResults(array());
             } else {
                 if ($row->Status == 'deleted') {
                     $this->Logger->debug('Node status is deleted');
                     $dto->setResults(array());
                 } else {
                     if (!$row->isIsActive() && !$showPending) {
                         $this->Logger->debug('Record is not active (and user is not permitted to see pending status)');
                         $dto->setResults(array());
                     } else {
                         $this->Logger->debug('Found node [' . $row->getNodeRef() . ']');
                         $this->Events->trigger('NodeWebController.single', $this->templateVars, $row);
                         foreach ((array) $row->getNodeRef()->getElement()->getAspects() as $aspect) {
                             $this->Events->trigger('NodeWebController' . '.@' . $aspect->Slug . '.' . 'single', $this->templateVars, $row);
                         }
                         $dto->setResults(array($row));
                     }
                 }
             }
         }
     } else {
         $dto->setResults(array());
     }
     return $this->readNodeQuery($dto);
 }
 protected function interactive()
 {
     echo "\nWelcome to the Crowd Fusion Node Database Monitor.  Commands end with ; or newline.\n";
     echo "Server version: " . $this->VersionService->getCrowdFusionVersion() . "\n";
     echo "\n";
     echo "Type 'help' for help. Type 'exit' to quit.\n";
     $codeBuffer = null;
     $history = array();
     do {
         echo "\ncf> ";
         /*
         $ans = strtolower( trim( `bash -c "read -n3 KEY; echo -n \\\$KEY | grep '\[A'"` ) );
         $ans = bin2hex($ans);
         if($ans == '1b5b61')
             echo "up arrow\n\n";
         //print_r(bin2hex($ans));
         exit;
         $ch = fgetc(STDIN);
         var_dump(ord($ch));
         exit;
         */
         $input = trim(fgets(STDIN));
         $input = rtrim($input, ';');
         try {
             if ($input != 'exit' && $input != 'quit') {
                 $parts = preg_split('/\\s+/', $input);
                 $action = strtolower($parts[0]);
                 //*********************************************
                 //*** RUN *************************************
                 //*********************************************
                 if ($action == 'run') {
                     if (empty($history)) {
                         $input = 'hist';
                     } else {
                         $input = $history[0];
                         if (isset($parts[1])) {
                             if (isset($history[intval($parts[1]) - 1])) {
                                 $input = $history[intval($parts[1]) - 1];
                             } else {
                                 $input = 'hist';
                             }
                         }
                     }
                     $parts = preg_split('/\\s+/', $input);
                     $action = strtolower($parts[0]);
                 }
                 //*********************************************
                 //*** HISTORY *********************************
                 //*********************************************
                 if ($action == 'hist' || $action == 'history') {
                     if (empty($history)) {
                         echo "Empty history\n";
                     } else {
                         $num = 10;
                         if (isset($parts[1]) && is_numeric($parts[1])) {
                             $num = intval($parts[1]);
                         }
                         for ($i = 0; $i < $num; $i++) {
                             if (isset($history[$i])) {
                                 echo " " . ($i + 1) . ") " . $history[$i] . "\n";
                             }
                         }
                     }
                 } else {
                     if ($action == 'show') {
                         $target = isset($parts[1]) ? strtolower($parts[1]) : null;
                         //************
                         //* ELEMENTS *
                         //************
                         if ($target == 'elements') {
                             $start = microtime(true);
                             $elements = $this->ElementService->findAll()->getResults();
                             $data = array();
                             foreach ($elements as $element) {
                                 $data['Name'][] = $element->Name;
                                 $data['Slug'][] = $element->Slug;
                                 $data['Description'][] = $element->Description;
                             }
                             $end = microtime(true);
                             $this->printTable($data, $end - $start);
                         } else {
                             if ($target == 'aspects') {
                                 //***************
                                 //* FOR ELEMENT *
                                 //***************
                                 if (isset($parts[2])) {
                                     if (strtolower($parts[2]) != 'for') {
                                         throw new Exception('Syntax Error. Expected "for [element slug]"');
                                     }
                                     if (!isset($parts[3])) {
                                         throw new Exception('Syntax Error. Expected "[element slug]"');
                                     }
                                     $target = strtolower($parts[3]);
                                     $start = microtime(true);
                                     $target = $this->ElementService->getBySlug($target);
                                     $aspects = $target->getAspects();
                                     $data = array();
                                     foreach ($aspects as $aspect) {
                                         $data['Name'][] = $aspect->Name;
                                         $data['Slug'][] = '@' . $aspect->Slug;
                                     }
                                     $end = microtime(true);
                                     $this->printTable($data, $end - $start);
                                 } else {
                                     $start = microtime(true);
                                     $aspects = $this->AspectService->findAll()->getResults();
                                     $data = array();
                                     foreach ($aspects as $aspect) {
                                         $data['Name'][] = $aspect->Name;
                                         $data['Slug'][] = '@' . $aspect->Slug;
                                         $data['Description'][] = $aspect->Description;
                                     }
                                     $end = microtime(true);
                                     $this->printTable($data, $end - $start);
                                 }
                             } else {
                                 if ($target == 'code') {
                                     if (empty($codeBuffer)) {
                                         echo "Code snippet buffer is empty. Please execute a query then type 'show code'.\n";
                                     } else {
                                         echo "\n";
                                         if (is_array($codeBuffer)) {
                                             echo implode("\n", $codeBuffer);
                                         } else {
                                             echo $codeBuffer;
                                         }
                                         echo "\n";
                                     }
                                 } else {
                                     throw new Exception('Syntax Error. Expected "elements" or "aspects"');
                                 }
                             }
                         }
                     } else {
                         if ($action == 'help') {
                             echo "help is coming...\n";
                         } else {
                             if ($action == 'describe' || $action == 'desc') {
                                 $target = strtolower($parts[1]);
                                 if (substr($target, 0, 1) == '@') {
                                     $start = microtime(true);
                                     $target = $this->AspectService->getBySlug(ltrim($target, '@'));
                                     $schema = $target->Schema;
                                     $data = array();
                                     $metaDefs = $schema->getMetaDefs();
                                     foreach ($metaDefs as $metaDef) {
                                         $validation = $metaDef->Validation->getValidationArray();
                                         $data['Type'][] = 'Meta';
                                         $data['Role'][] = '#' . $metaDef->Id;
                                         $data['Title'][] = $metaDef->Title;
                                         $data['Datatype'][] = $metaDef->Datatype;
                                         $data['Default'][] = $metaDef->Default;
                                         $data['Nullable'][] = $validation['nullable'] ? 'true' : 'false';
                                         $data['Match'][] = $validation['match'];
                                         $data['Min'][] = $validation['min'];
                                         $data['Max'][] = $validation['max'];
                                         $data['Sortable'][] = '';
                                         $data['QuickAdd'][] = '';
                                         $data['Multiple'][] = '';
                                         $data['Fieldlike'][] = '';
                                     }
                                     //sortable,quickadd,filter,fieldlike
                                     $tagDefs = $schema->getTagDefs();
                                     foreach ($tagDefs as $tagDef) {
                                         //$validation = $metaDef->Validation->getValidationArray();
                                         $data['Type'][] = ucfirst($tagDef->Direction);
                                         $data['Role'][] = '#' . $tagDef->Id;
                                         $data['Title'][] = $tagDef->Title;
                                         $data['Datatype'][] = $tagDef->Partial;
                                         $data['Default'][] = '';
                                         $data['Nullable'][] = '';
                                         $data['Match'][] = '';
                                         $data['Min'][] = '';
                                         $data['Max'][] = '';
                                         $data['Sortable'][] = $tagDef->Sortable ? 'true' : 'false';
                                         $data['QuickAdd'][] = $tagDef->QuickAdd ? 'true' : 'false';
                                         $data['Multiple'][] = $tagDef->Multiple ? 'true' : 'false';
                                         $data['Fieldlike'][] = $tagDef->Fieldlike ? 'true' : 'false';
                                     }
                                     //print_r($schema);
                                     $end = microtime(true);
                                     $this->printTable($data, $end - $start);
                                 } else {
                                     $start = microtime(true);
                                     $target = $this->ElementService->getBySlug($target);
                                     $data = array('Name' => array($target->Name), 'Slug' => array($target->Slug), 'Description' => array($target->Description), 'Base URL' => array($target->BaseURL), 'Default Order' => array($target->DefaultOrder), 'Allow Slug Slashes' => array($target->AllowSlugSlashes ? "true" : "false"), 'Anchored Site' => array($target->AnchoredSiteSlug));
                                     $end = microtime(true);
                                     $this->printTable($data, $end - $start);
                                 }
                             } else {
                                 if ($action == 'select') {
                                     $codeBuffer = array();
                                     $m = array();
                                     if (preg_match('/^(select)\\s+(?P<fields>.+)\\s+(from)\\s+(?P<element>[@a-z0-9\\-]+)(?P<conditions>.+)?/i', $input, $m)) {
                                         $start = microtime(true);
                                         $selectedFields = array();
                                         $selectedMeta = array();
                                         if (strtolower($m['fields']) == 'count') {
                                             $fields = 'count';
                                         } else {
                                             $fields = preg_split('/\\s*,\\s*/', $m['fields']);
                                             $validFields = array('Title', 'Slug', 'ActiveDate', 'Status', 'CreationDate', 'ModifiedDate', 'SortOrder', 'NodeRef');
                                             $validMeta = array();
                                             $validFieldsLower = array();
                                             foreach ($validFields as $f) {
                                                 $validFieldsLower[] = strtolower($f);
                                             }
                                             if (substr($m['element'], 0, 1) == '@') {
                                                 $target = $this->AspectService->getBySlug(ltrim($m['element'], '@'));
                                                 if ($target == null) {
                                                     throw new Exception('Aspect not found: ' . $m['element']);
                                                 }
                                                 $schema = $target->Schema;
                                                 $metaDefs = $schema->getMetaDefs();
                                                 foreach ($metaDefs as $metaDef) {
                                                     $validFieldsLower[] = '#' . strtolower($metaDef->Id);
                                                     $validMeta[] = '#' . strtolower($metaDef->Id);
                                                 }
                                             } else {
                                                 $target = $this->ElementService->getBySlug($m['element']);
                                                 if ($target == null) {
                                                     throw new Exception('Element not found: ' . $m['element']);
                                                 }
                                                 $schema = $target->Schema;
                                                 $metaDefs = $schema->getMetaDefs();
                                                 foreach ($metaDefs as $metaDef) {
                                                     $validFieldsLower[] = '#' . strtolower($metaDef->Id);
                                                     $validMeta[] = '#' . strtolower($metaDef->Id);
                                                 }
                                             }
                                             $validFieldsLowerFlipped = array_flip($validFieldsLower);
                                             foreach ($fields as $field) {
                                                 if (!in_array(strtolower($field), $validFieldsLower)) {
                                                     throw new Exception("Invalid field '{$field}'. Permitted fields: " . implode(array_merge($validFields, $validMeta), ', '));
                                                 }
                                                 if (in_array(strtolower($field), $validMeta)) {
                                                     $selectedMeta[] = strtolower($field);
                                                 } else {
                                                     $selectedFields[] = $validFields[$validFieldsLowerFlipped[strtolower($field)]];
                                                 }
                                             }
                                         }
                                         $nq = new NodeQuery();
                                         $codeBuffer[] = '$nq = new NodeQuery();';
                                         $nq->setParameter('Elements.in', $m['element']);
                                         $codeBuffer[] = '$nq->setParameter("Elements.in","' . $m['element'] . '");';
                                         $limit = null;
                                         $offset = 0;
                                         if ($fields == 'count') {
                                             $nq->setParameter('Count.only', true);
                                             $codeBuffer[] = '$nq->setParameter("Count.only",true);';
                                         } else {
                                             if (!empty($selectedMeta)) {
                                                 $nq->setParameter('Meta.select', implode($selectedMeta, ','));
                                                 $codeBuffer[] = '$nq->setParameter("Meta.select","' . implode($selectedMeta, ',') . '");';
                                             }
                                             $conditions = $m['conditions'];
                                             //PROCESS LIMIT
                                             if (preg_match('/(limit)\\s+(?P<limit>\\d+)/i', $conditions, $limitMatch)) {
                                                 $limit = intval($limitMatch['limit']);
                                                 $codeBuffer[] = '$nq->setLimit(' . $limit . ');';
                                             }
                                             //PROCESS OFFSET
                                             if (preg_match('/(offset)\\s+(?P<offset>\\d+)/i', $conditions, $offsetMatch)) {
                                                 $offset = intval($offsetMatch['offset']);
                                                 $codeBuffer[] = '$nq->setOffset(' . $offset . ');';
                                             }
                                             //todo: process where
                                             //todo: process order by
                                             //todo: process as json
                                         }
                                         if ($fields == 'count') {
                                             $total = $this->NodeService->findAll($nq)->getTotalRecords();
                                             $codeBuffer[] = '$total = $this->NodeService->findAll($nq)->getTotalRecords()';
                                             $data = array('Total' => array($total));
                                         } else {
                                             //if no limit set or limit is > 1000, loop through in chunks of 1000 until no results or requested limit is reached
                                             $count = 0;
                                             $nq->setOffset($offset);
                                             $nq->setLimit($limit == null || $limit > 1000 ? 1000 : $limit);
                                             $results = $this->NodeService->findAll($nq)->getResults();
                                             $codeBuffer[] = '$results = $this->NodeService->findAll($nq)->getResults();';
                                             $data = array();
                                             while (!empty($results)) {
                                                 if (!empty($results)) {
                                                     foreach ($results as $r) {
                                                         foreach ($selectedFields as $field) {
                                                             $data[$field][] = $r->{$field};
                                                         }
                                                         foreach ($selectedMeta as $field) {
                                                             $data[$field][] = $r->getMetaValue($field);
                                                         }
                                                         $count++;
                                                     }
                                                 }
                                                 $results = null;
                                                 if ($limit != null && $count >= $limit) {
                                                     break;
                                                 }
                                                 if ($limit == null || $limit > 1000) {
                                                     $offset += 1000;
                                                     $nq->clearResults();
                                                     $nq->setOffset($offset);
                                                     $results = $this->NodeService->findAll($nq)->getResults();
                                                 }
                                             }
                                         }
                                         $end = microtime(true);
                                         $this->printTable($data, $end - $start);
                                         if (isset($history[0]) && $history[0] != $input || empty($history)) {
                                             array_unshift($history, $input);
                                         }
                                     } else {
                                         if ($action == 'update') {
                                             throw new Exception('you wish!');
                                         } else {
                                             if ($action == 'delete') {
                                                 throw new Exception('you wish!');
                                             } else {
                                                 throw new Exception("shut yo mouth");
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 //print_r($parts);
             }
         } catch (Exception $e) {
             echo "ERROR: " . $e->getMessage() . "\n";
         }
     } while ($input != 'exit' && $input != 'quit');
     echo "Bye\n";
 }
 public function populateDefaults($elements = 'all')
 {
     $log = '';
     if ($elements == 'all') {
         $elements = $this->ElementService->findAll()->getResults();
     } else {
         $elementSlugs = StringUtils::smartExplode($elements);
         $elements = array();
         foreach ($elementSlugs as $eSlug) {
             $elements[] = $this->ElementService->getBySlug($eSlug);
         }
     }
     foreach ($elements as $element) {
         $offset = 0;
         $nq = new NodeQuery();
         $nq->setParameter('Elements.in', $element->getSlug());
         $nq->setParameter('Meta.select', 'all');
         $nq->setLimit(1000);
         $nq->setOffset($offset);
         $nq->asObjects();
         $nq->isRetrieveTotalRecords(true);
         $nq = $this->NodeService->findAll($nq, true);
         $nodes = $nq->getResults();
         $tCount = $nq->getTotalRecords();
         $count = 0;
         while (count($nodes) > 0) {
             foreach ($nodes as $node) {
                 $this->NodeMapper->defaultsOnNode($node);
                 $this->NodeService->edit($node);
                 ++$count;
             }
             $offset += 1000;
             $nq = new NodeQuery();
             $nq->setParameter('Elements.in', $element->getSlug());
             $nq->setParameter('Meta.select', 'all');
             $nq->setLimit(1000);
             $nq->setOffset($offset);
             $nq->asObjects();
             $nodes = $this->NodeService->findAll($nq)->getResults();
         }
         $log .= 'Updated defaults on ' . $count . ' of ' . $tCount . ' ' . $element->getSlug() . " nodes.\n";
     }
     return $log;
 }