From b6b334d57e32179ffca30502b5c4af4870f95ecd Mon Sep 17 00:00:00 2001 From: Julien Jomier Date: Fri, 25 Mar 2011 10:41:14 +0100 Subject: [PATCH] ENH: Improvements for Cassandra --- core/models/base/GroupModelBase.php | 2 +- core/models/base/UserModelBase.php | 6 +- core/models/cassandra/FeedpolicyuserModel.php | 2 +- core/models/cassandra/FolderModel.php | 2 +- .../cassandra/FolderpolicygroupModel.php | 87 +++++++++++++-- .../cassandra/FolderpolicyuserModel.php | 80 +++++++++++++- core/models/cassandra/GroupModel.php | 10 +- library/MIDAS/models/GlobalDao.php | 6 +- .../MIDAS/models/MIDASDatabaseCassandra.php | 101 ++++++++++++++---- library/MIDAS/models/MIDASModel.php | 3 +- sql/cassandra/midas.txt | 7 +- 11 files changed, 253 insertions(+), 53 deletions(-) diff --git a/core/models/base/GroupModelBase.php b/core/models/base/GroupModelBase.php index ba21a9be0..e8cc25f0b 100644 --- a/core/models/base/GroupModelBase.php +++ b/core/models/base/GroupModelBase.php @@ -35,7 +35,7 @@ public function createGroup($communityDao,$name) $group=new GroupDao(); $group->setName($name); $group->setCommunityId($communityDao->getCommunityId()); - $this->save($group); + $this->save($group); return $group; } diff --git a/core/models/base/UserModelBase.php b/core/models/base/UserModelBase.php index 59ca1b72e..b39a1380d 100644 --- a/core/models/base/UserModelBase.php +++ b/core/models/base/UserModelBase.php @@ -71,14 +71,14 @@ public function createUser($email,$password,$firstname,$lastname,$admin=0) $feedModel=$this->ModelLoader->loadModel('Feed'); $feedpolicygroupModel=$this->ModelLoader->loadModel('Feedpolicygroup'); $feedpolicyuserModel=$this->ModelLoader->loadModel('Feedpolicyuser'); - $anonymousGroup=$groupModel->load(MIDAS_GROUP_ANONYMOUS_KEY); - + $folderGlobal=$folderModel->createFolder('user_' . $userDao->getKey(),'Main folder of ' . $userDao->getFullName(),MIDAS_FOLDER_USERPARENT); $folderPrivate=$folderModel->createFolder('Private','Private folder of ' . $userDao->getFullName(),$folderGlobal); $folderPublic=$folderModel->createFolder('Public','Public folder of ' . $userDao->getFullName(),$folderGlobal); - + $folderpolicygroupModel->createPolicy($anonymousGroup,$folderPublic,MIDAS_POLICY_READ); + $folderpolicyuserModel->createPolicy($userDao,$folderPrivate,MIDAS_POLICY_ADMIN); $folderpolicyuserModel->createPolicy($userDao,$folderGlobal,MIDAS_POLICY_ADMIN); $folderpolicyuserModel->createPolicy($userDao,$folderPublic,MIDAS_POLICY_ADMIN); diff --git a/core/models/cassandra/FeedpolicyuserModel.php b/core/models/cassandra/FeedpolicyuserModel.php index 23fea26b3..eb885c7b3 100644 --- a/core/models/cassandra/FeedpolicyuserModel.php +++ b/core/models/cassandra/FeedpolicyuserModel.php @@ -7,7 +7,7 @@ */ class FeedpolicyuserModel extends FeedpolicyuserModelBase { - + } // end class ?> diff --git a/core/models/cassandra/FolderModel.php b/core/models/cassandra/FolderModel.php index ac8b751ed..30d80dda5 100644 --- a/core/models/cassandra/FolderModel.php +++ b/core/models/cassandra/FolderModel.php @@ -17,7 +17,7 @@ function getByFolder_id($folderid) $folderarray = $folder->get($folderid); // Add the user_id $folderarray[$this->_key] = $folderid; - $dao= $this->initDao('Folder',$userarray); + $dao= $this->initDao('Folder',$userarray); } catch(cassandra_NotFoundException $e) { diff --git a/core/models/cassandra/FolderpolicygroupModel.php b/core/models/cassandra/FolderpolicygroupModel.php index 6e0da80e7..8aaba08be 100644 --- a/core/models/cassandra/FolderpolicygroupModel.php +++ b/core/models/cassandra/FolderpolicygroupModel.php @@ -8,22 +8,91 @@ class FolderpolicygroupModel extends FolderpolicygroupModelBase { /** getPolicy - * @return FolderpolicyuserDao + * @return FolderpolicygroupDao */ - public function getPolicy($user, $folder) + public function getPolicy($group, $folder) { - if(!$user instanceof UserDao) + if(!$group instanceof GroupDao) { - throw new Zend_Exception("Should be a user."); + throw new Zend_Exception("Should be a group."); } if(!$folder instanceof FolderDao) { throw new Zend_Exception("Should be a folder."); } - return $this->initDao('Folderpolicyuser',$this->database->fetchRow($this->database->select() - ->where('folder_id = ?',$folder->getKey()) - ->where('user_id = ?',$user->getKey()) - )); - } + $folderid = $folder->getKey(); + $groupid = $group->getKey(); + + $column = 'group_'.$groupid; + $folderarray = $this->database->getCassandra('folder',$folderid,array($column)); + + // Massage the data to the proper format + $newarray['folder_id'] = $folderid; + $newarray['group_id'] = $groupid; + $newarray['policy'] = $folderarray[$column]; + + return $this->initDao('Folderpolicygroup',$newarray); + } // end getPolicy() + + /** Custom save command */ + public function save($dao) + { + $instance=$this->_name."Dao"; + if(!$dao instanceof $instance) + { + throw new Zend_Exception("Should be an object ($instance)."); + } + + try + { + $folderid = $dao->getFolderId(); + $groupid = $dao->getGroupId(); + $column = 'group_'.$groupid; + + $dataarray = array(); + $dataarray[$column] = $dao->getPolicy(); + + $column_family = new ColumnFamily($this->database->getDB(),'folder'); + $column_family->insert($folderid,$dataarray); + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } + + $dao->saved = true; + return true; + } // end save() + + /** Custome delete command */ + public function delete($dao) + { + $instance=ucfirst($this->_name)."Dao"; + if(get_class($dao) != $instance) + { + throw new Zend_Exception("Should be an object ($instance). It was: ".get_class($dao) ); + } + if(!$dao->saved) + { + throw new Zend_Exception("The dao should be saved first ..."); + } + + try + { + // Remove the column group from the folder + $folderid = $dao->getFolderId(); + $groupid = $dao->getGroupId(); + $column = 'group_'.$groupid; + $cf = new ColumnFamily($this->database->getDB(),'folder'); + $cf->remove($folderid,array($column)); + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } + $dao->saved=false; + return true; + } + } // end class ?> diff --git a/core/models/cassandra/FolderpolicyuserModel.php b/core/models/cassandra/FolderpolicyuserModel.php index 31a9f3ae1..aa356a8a4 100644 --- a/core/models/cassandra/FolderpolicyuserModel.php +++ b/core/models/cassandra/FolderpolicyuserModel.php @@ -20,11 +20,81 @@ public function getPolicy($user, $folder) { throw new Zend_Exception("Should be a folder."); } - return $this->initDao('Folderpolicyuser',$this->database->fetchRow($this->database->select() - ->where('folder_id = ?',$folder->getKey()) - ->where('user_id = ?',$user->getKey()) - )); - } + + $folderid = $folder->getKey(); + $userid = $user->getKey(); + + $folder = new ColumnFamily($this->database->getDB(), 'folder'); + $column = 'user_'.$userid; + $folderarray = $this->database->getCassandra('folder',$folderid,array($column)); + + // Massage the data to the proper format + $newarray['folder_id'] = $folderid; + $newarray['user_id'] = $userid; + $newarray['policy'] = $folderarray[$column]; + + return $this->initDao('Folderpolicyuser',$newarray); + } // end getPolicy + + /** Custom save command */ + public function save($dao) + { + $instance=$this->_name."Dao"; + if(!$dao instanceof $instance) + { + throw new Zend_Exception("Should be an object ($instance)."); + } + + try + { + $folderid = $dao->getFolderId(); + $userid = $dao->getUserId(); + $column = 'user_'.$userid; + + $dataarray = array(); + $dataarray[$column] = $dao->getPolicy(); + + $column_family = new ColumnFamily($this->database->getDB(),'folder'); + $column_family->insert($folderid,$dataarray); + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } + $dao->saved = true; + return true; + } // end save() + + /** Custome delete command */ + public function delete($dao) + { + $instance=ucfirst($this->_name)."Dao"; + if(get_class($dao) != $instance) + { + throw new Zend_Exception("Should be an object ($instance). It was: ".get_class($dao) ); + } + if(!$dao->saved) + { + throw new Zend_Exception("The dao should be saved first ..."); + } + + try + { + // Remove the column user from the folder + $folderid = $dao->getFolderId(); + $userid = $dao->getUserId(); + $column = 'user_'.$userid; + $cf = new ColumnFamily($this->database->getDB(),'folder'); + $cf->remove($folderid,array($column)); + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } + $dao->saved=false; + return true; + } + } // end class ?> diff --git a/core/models/cassandra/GroupModel.php b/core/models/cassandra/GroupModel.php index 33f3d30e2..7000b0b42 100644 --- a/core/models/cassandra/GroupModel.php +++ b/core/models/cassandra/GroupModel.php @@ -21,9 +21,7 @@ function addUser($group,$user) throw new Zend_Exception("Should be an user."); } - echo $group->getGroupId()."
"; - echo $user->getUserId()."
"; - + $column_family = new ColumnFamily($this->database->getDB(), 'group'); $data = array(); @@ -31,11 +29,7 @@ function addUser($group,$user) $userarray[$user->getUserId()] = 1; $data['users'] = $userarray; - $column_family->insert($group->getGroupId(),$data); - - exit(); - - + $column_family->insert($group->getGroupId(),$data); } // end function addUser } // end class diff --git a/library/MIDAS/models/GlobalDao.php b/library/MIDAS/models/GlobalDao.php index e2484bbae..a46e25042 100644 --- a/library/MIDAS/models/GlobalDao.php +++ b/library/MIDAS/models/GlobalDao.php @@ -53,10 +53,10 @@ public function initValues($key) { if(!isset($key)) { - throw new Zend_Exception("Model PDO " . $this->getModel()->_name . ": key is not defined here."); + throw new Zend_Exception("Model " . $this->getModel()->_name . ": key is not defined here."); } - $values = $this->getModel()->getValues($key); - if ($values == NULL) + $values = $this->getModel()->getValues($key); + if ($values == null) { return false; } diff --git a/library/MIDAS/models/MIDASDatabaseCassandra.php b/library/MIDAS/models/MIDASDatabaseCassandra.php index d2a478e83..67fd82cb5 100644 --- a/library/MIDAS/models/MIDASDatabaseCassandra.php +++ b/library/MIDAS/models/MIDASDatabaseCassandra.php @@ -49,11 +49,15 @@ public function getValues($key) try { $column_family = new ColumnFamily($db, $this->_name); - return $column_family->get($key); + + // We need to add the key + $array = $column_family->get($key); + $array[$this->_key] = $key; + return (object)$array; } catch(cassandra_NotFoundException $e) { - return false; + return null; } catch(Exception $e) { @@ -69,22 +73,29 @@ public function getValues($key) */ public function save($dataarray) { - // There is no update in Cassandra, everything is insert by key - if(isset($this->_key)&&isset($dataarray[$this->_key])) + try { - $keyvalue = $dataarray[$this->_key]; - unset($dataarray[$this->_key]); - - $column_family = new ColumnFamily($this->_db,$this->_name); - $column_family->insert($keyvalue,$dataarray); - } - else - { - $keyvalue = CassandraUtil::uuid1(); - $db = Zend_Registry::get('dbAdapter'); - $column_family = new ColumnFamily($this->_db,$this->_name); - $column_family->insert($keyvalue,$dataarray); - } + // There is no update in Cassandra, everything is insert by key + if(isset($this->_key)&&isset($dataarray[$this->_key])) + { + $keyvalue = $dataarray[$this->_key]; + unset($dataarray[$this->_key]); + + $column_family = new ColumnFamily($this->_db,$this->_name); + $column_family->insert($keyvalue,$dataarray); + } + else + { + $keyvalue = CassandraUtil::uuid1(); + $db = Zend_Registry::get('dbAdapter'); + $column_family = new ColumnFamily($this->_db,$this->_name); + $column_family->insert($keyvalue,$dataarray); + } + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } return $keyvalue; } // end function save @@ -96,8 +107,41 @@ public function save($dataarray) */ public function delete($dao) { - throw new Zend_Exception("MIDASDatabaseCassandra: Delete not implemented yet"); + $instance=ucfirst($this->_name)."Dao"; + if(get_class($dao) != $instance) + { + throw new Zend_Exception("Should be an object ($instance). It was: ".get_class($dao) ); + } + if(!$dao->saved) + { + throw new Zend_Exception("The dao should be saved first ..."); + } + if(!isset($this->_key) || !$this->_key) + { + throw new Zend_Exception("MIDASDatabaseCassandra::delete() : Cannot delete record by something other than a key." ); + return false; + } + + $key=$dao->getKey(); + if(!isset($key)) + { + throw new Zend_Exception("Unable to find the key" ); + } + + try + { + $cf = new ColumnFamily($this->_db,$this->_name); + $cf->remove($key); + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } + + unset($dao->{$dao->_key}); + $dao->saved=false; + return true; } // end function delete /** return the number row in the table @@ -185,9 +229,28 @@ public function getValue($var, $key, $dao) } else { - throw new Zend_Exception('Unable to load data type ' . $var); + throw new Zend_Exception('MIDASDatabaseCassandra: getValue() Unable to load data type ' . $var); } } + + /** Helper function for cassandra */ + function getCassandra($columnfamily,$key,$columns) + { + try + { + $cf = new ColumnFamily($this->_db,$columnfamily); + return $cf->get($key,$columns); + } + catch(cassandra_NotFoundException $e) + { + return false; + } + catch(Exception $e) + { + throw new Zend_Exception($e); + } + } // end getCassandra() + } // end class MIDASDatabaseCassandra ?> diff --git a/library/MIDAS/models/MIDASModel.php b/library/MIDAS/models/MIDASModel.php index 6d5d768a3..10c4b22fc 100644 --- a/library/MIDAS/models/MIDASModel.php +++ b/library/MIDAS/models/MIDASModel.php @@ -56,7 +56,8 @@ public function save($dao) } } - $insertedid = $this->database->save($dataarray); + $insertedid = $this->database->save($dataarray); + if($insertedid !== false) { if(isset($this->_key) && !empty($this->_key)) diff --git a/sql/cassandra/midas.txt b/sql/cassandra/midas.txt index 56051dc5c..c4c45825c 100644 --- a/sql/cassandra/midas.txt +++ b/sql/cassandra/midas.txt @@ -8,8 +8,11 @@ use midas; create column family user with column_type = 'Standard' and comparator = UTF8Type create column family emailuser with column_type = 'Standard' and comparator = UTF8Type create column family item with column_type = 'Standard' and comparator = 'UTF8Type'; -create column family folder with column_type ='Super'; -create column family community; +create column family folder with column_type = 'Standard' and comparator = 'UTF8Type'; +create column family community with column_type = 'Standard' and comparator = 'UTF8Type'; +create column family group with column_type = 'Standard' and comparator = 'UTF8Type'; + +set group['0']['name'] = 'Anonymous'; /** To import this schema. Run the following on your machine */ /* $ bin/cassandra-cli --host localhost --batch < schema.txt */ \ No newline at end of file