上文中我们已经建立了项目的基本结构,今天实现数据的修改。在NoSQL中,通常添加和修改都认为是对数据的一种Mutation。
 

1.建立描述修改Row的实体。

    public class RowMutation
{
public string Key { get; set; } public IList<CellMutation> Mutations { get; set; } public RowMutation()
{ } public RowMutation(string key)
{
Key = key;
} public RowMutation(string key, IList<CellMutation> mutations)
{
Key = key;
Mutations = mutations;
}
} public class CellMutation
{
public string ColumnName { get; set; } public string DataValue { get; set; } public CellMutation()
{ } public CellMutation(string name)
{
ColumnName = name;
} public CellMutation(string name, string value)
{
ColumnName = name;
DataValue = value;
}
}

2.引用aquiles命名空间。

using Aquiles.Helpers.Encoders;
using Aquiles.Cassandra10;
using Aquiles.Core.Cluster;

3.初始化成员变量

        private string _clusterName { get; set; }
private ConsistencyLevel _consistencyLevel { get; set; }
private string _keyspaceName { get; set; }
private ICluster _cluster = null; public AquilesDemo()
{
_clusterName = "xxxx";
_consistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
_keyspaceName = "xxxx"; _cluster = AquilesHelper.RetrieveCluster(_clusterName);
}

4.建立一个通用的修改多行多列的方法,其它改变方式可以在此基础上完成调用,如修改一多一列,一行多列等。

       public void Mutate(string columnFamily, IList<RowMutation> rowMutations)
{
if (string.IsNullOrWhiteSpace(columnFamily)) throw new ArgumentNullException("columnFamily"); rowMutations = PrepareMutationList(rowMutations);
Dictionary<byte[], Dictionary<string, List<Apache.Cassandra.Mutation>>> mutation_map = new Dictionary<byte[], Dictionary<string, List<Apache.Cassandra.Mutation>>>(); foreach (var rowMutation in rowMutations)
{
byte[] key = ByteEncoderHelper.UTF8Encoder.ToByteArray(rowMutation.Key); Dictionary<string, List<Apache.Cassandra.Mutation>> cfMutation = new Dictionary<string, List<Apache.Cassandra.Mutation>>();
List<Apache.Cassandra.Mutation> mutationList = new List<Apache.Cassandra.Mutation>(); foreach (CellMutation cellMutation in rowMutation.Mutations)
{
if (cellMutation.DataValue == null) continue; Apache.Cassandra.Mutation mutation = new Apache.Cassandra.Mutation()
{
Column_or_supercolumn = new ColumnOrSuperColumn()
{
Column = new Column()
{
Name = ByteEncoderHelper.UTF8Encoder.ToByteArray(cellMutation.ColumnName),
Timestamp = DateTime.Now.ToUnixTimestamp(),
Value = ByteEncoderHelper.UTF8Encoder.ToByteArray(cellMutation.DataValue),
},
},
};
mutationList.Add(mutation);
} if (mutationList.Count > )
{
cfMutation.Add(columnFamily, mutationList);
mutation_map.Add(key, cfMutation);
}
} if (mutation_map.Count == ) return;
_cluster.Execute(new ExecutionBlock(delegate(Apache.Cassandra.Cassandra.Client client)
{
client.batch_mutate(mutation_map, _consistencyLevel);
return null;
}), _keyspaceName); }

5. 由于调用端可能会将同一行的修改分为多个RowMutation传入,所以上面的代码使用PrepareMutationList方法根据RowKey作了聚合处理。

        /// <summary>
/// 聚合列表中相同rowkey的项为同一Mutation。
/// </summary>
/// <param name="rowMutations"></param>
/// <returns></returns>
private IList<RowMutation> PrepareMutationList(IList<RowMutation> rowMutations)
{
if (rowMutations == null) return null; //按rowkey分组
var rowMutationGroups = rowMutations.GroupBy(rm => rm.Key); //分组后的总数量相同,则认为rowkey在列表中是唯一的,不用做聚合处理
if (rowMutations.Count == rowMutationGroups.Count()) return rowMutations; //遍历分组结果
IList<RowMutation> result = new List<RowMutation>();
foreach (var rmg in rowMutationGroups)
{
RowMutation rowMutation = new RowMutation();
rowMutation.Key = rmg.Key; //将同一分组的所有CellMutation放在一个列表中
List<CellMutation> cellMutations = new List<CellMutation>();
foreach (var rm in rmg)
{
cellMutations.AddRange(rm.Mutations);
} if (cellMutations.Count() > )
{
rowMutation.Mutations = cellMutations;
result.Add(rowMutation);
}
}
return result;
}

在.net中使用aquiles访问Cassandra(二)的更多相关文章

  1. 在.net中使用aquiles访问Cassandra(一)

    aquiles是.net下基于Thrift协议访问Cassandra的第三方类库,官方地址是: http://aquiles.codeplex.com/   1.下载类库文件: http://aqui ...

  2. 在.net中使用aquiles访问Cassandra(四)

    数据的持久化我们都已经完成了,和所有应有程序一样,最重要的是要向用户展示数据.下面我们就推出这部分代码,读取任意行任何列: public IList<TRowResult> Execute ...

  3. 在.net中使用aquiles访问Cassandra(三)

    之前我们实现了如何修改数据,还需要相应的删除动作.删除方式会有几种情况,以下分别一一介绍.   1.批量删除,适应于多行多列的情况. public void Remove(string columnF ...

  4. ArcGIS Engine中的数据访问

    ArcGIS Engine中的数据访问 数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文 ...

  5. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  6. 自建目录中jsp页面访问servlet路径出错404

    ---恢复内容开始--- 自建目录中jsp页面访问servlet路径出错404 使用eclipse建立的项目,总是会遇到路径问题,比如jsp页面访问servlet,jsp在默认的路径.jsp在自建目录 ...

  7. 在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持)

    在KVM虚拟机中使用spice系列之二(USB映射,SSL,密码,多客户端支持) 发布时间: 2015-02-27 00:16 1.spice的USB重定向 1.1 介绍 使用usb重定向,在clie ...

  8. 【java】基础中的杂乱总结(二)

    1 内部类进阶 package package8; //原则:先用内部类写 之后由于内部类匿名无法引用 用其继承的父类或实现的接口名 //再复写所有的抽象方法即可(是所有,否者还是抽象的,无法创建对象 ...

  9. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

随机推荐

  1. 数据类型安全验证都交给TryParse吧

    C# 网站开发中 往往在编写后台代码中遇到从字符类型转换到其他类型.其实无需在单独验证字符串长度,是否为空等工作.直接用Tryparse转换,如果转换失败说明字符串的格式等有误.成功则再进一步验证转换 ...

  2. ES6详解

    1.ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const声明常亮,不可改变 2.变量的解构赋值 (1)数组的解构赋值: 以前,为 ...

  3. 基于Django的web开发

    github地址:https://github.com/shirleyandgithub/PythonWeb

  4. ContentProvider要点复习

    ContentProvider要点复习 ContentProvider作为四大组件之一,发挥着举足轻重的作用.与之相关联的另外两个类分别是ContentResolver和ContentObserver ...

  5. PHP-仿ecshop生成验证码

    <?php /* 生成验证码 */ // 1.创建画布(基于已有图像) $n = mt_rand(1,5); $im = imagecreatefromjpeg('./images/captch ...

  6. React Ntive 学习手记

    React使今年来比较热门的前端库,之所以说是库呢,因为React.js是应用于MVC中的V层, 它并不是一个完整的MVC框架,所以,我也不知称之为框架了. 不过这并不影响React的火热. 混合应用 ...

  7. 【dubbo】dubbo项目基本结构及provider构建

    dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...

  8. P1906联合权值

    描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离. ...

  9. 【转】Linux 文件夹文件创建与删除

    [转自:Linux文件夹文件创建.删除 - 风生水起 - 博客园] 1. 删除文件夹 rm -rf  fileNamede> -删除文件夹实例:rm -rf /var/log/httpd/acc ...

  10. Linux Ubuntu12.04下安装OpenCv2.4.10

    参考 http://blog.sina.com.cn/s/blog_53b0956801010lfu.html 捣鼓了一个晚上了,OpenCv还没装好,本来以为看个类似的比如Ubuntu安装OpenC ...