现在的位置: 首页 > 综合 > 正文

MeayunDB学习笔记(三)索引应用

2013年03月27日 ⁄ 综合 ⁄ 共 5702字 ⁄ 字号 评论关闭
系列目录
 
 
 
一、MeayunDB表配置
 
首先需要在配置文件config.xml中配置表,MeayunDB标准版没有提供自动化创建表的工具,企业版和数据中心版支持自动化创建,而不是手动修改配置文件
    

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<tables>
  <!--配置内存数据表,primary为表的主索引,唯一确定一条记录,name为表名-->
  <table primary="id" name="tb_object_0002">
    <!--数据列属性,name为列名,type为列类型:Bool,Byte,Int16, Date,Int32,Time, Int64,Double,String-->
    <column name="id" type="int64"></column>
    <column name="F1_0002" type="string"></column>
    <column name="F2_0002" type="string"></column>
    <column name="F3_0002" type="string"></column>
    <column name="F4_0002" type="string"></column>
    <column name="F5_0002" type="string"></column>
    <column name="F6_0002" type="string"></column>
    <column name="F7_0002" type="string"></column>
    <column name="F8_0002" type="date"></column>
    <indexes>
      <!--数据表索引,name为索引名,type为索引类型,keys为创建索引的数据列,有先后顺序之分-->
      <index name="securities" type="Dictionary" keys="F1_0002"></index>
    </indexes>
  </table>
  <table primary="id" name="tb_object_0001">
    <column name="id" type="int64"></column>
    <column name="F1_0001" type="string"></column>
    <column name="F2_0001" type="date"></column>
    <column name="F3_0001" type="double"></column>
    <column name="F4_0001" type="double"></column>
    <column name="F5_0001" type="double"></column>
    <column name="F6_0001" type="double"></column>
    <column name="F7_0001" type="double"></column>
    <column name="F8_0001" type="double"></column>
    <indexes>
      <index name="quotation" type="DictionarySortedList" keys="F1_0001,F2_0001"></index>
    </indexes>
  </table>
  <table primary="F1" name="Test">
    <column name="F1" type="int64"></column>
    <column name="F2" type="int64"></column>
    <column name="F3" type="int64"></column>
    <column name="F4" type="int64"></column>
    <column name="F5" type="int64"></column>
    <indexes>
      <index name="T1" type="Dictionary" keys="F1"></index>
      <index name="T2" type="Dictionary2" keys="F1,F2"></index>
      <index name="T3" type="Dictionary2Bucket" keys="F1,F2"></index>
      <index name="T4" type="DictionaryBucket" keys="F1"></index>
      <index name="T5" type="DictionarySortedBucket" keys="F1,F2"></index>
      <index name="T6" type="DictionarySortedList" keys="F1,F2"></index>
      <index name="T7" type="SortedBucket" keys="F1"></index>
      <index name="T8" type="SortedDictionary" keys="F1,F2"></index>
      <index name="T9" type="SortedDictionaryBucket" keys="F1,F2"></index>
      <index name="T10" type="SortedList" keys="F1"></index>
    </indexes>
  </table>
</tables>
复制代码

 

索引可以是如下类型:

 
 
二、索引使用
 
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MeayunDB;

namespace Domain
{
    /// <summary>
    /// 计算上交所股票成交额
    /// </summary>
    [Command("{\"action\":\"Amount\"}", "计算上交所股票成交额")]
    public class Amount : BaseAction
    {
        public override JsonObject DoAction(JsonTree parameters)
        {
            // 构造返回结果,此action返回表,包含三列
            Table result = new Table();
            result.Append("证券代码", DataType.String);
            result.Append("证券名称", DataType.String);
            result.Append("成交额", DataType.Double);

            // 按索引名取索引,需要在config.xml配置表和索引,请参考config.xml配置文件
            Dictionary<string> securities = Indexes.Current["securities"] as Dictionary<string>;
            DictionarySortedList<string, int> quotation = Indexes.Current["quotation"] as DictionarySortedList<string, int>;

            // 查询股票代码,访问Dictionary的接口
            List<int> pointers = securities.Find();
            if (pointers.IsNull())
                return null;

            // 枚举股票代码
            foreach (int pointer in pointers)
            {
                // 取当前枚举的股票代码
                string securityCode = securities.Get<string>("F1_0002", pointer);

                // 取当前股票的所有行情记录
                List<int> list = quotation.Find(securityCode, true);
                if (list.IsNull())
                    continue;

                result.Add<string>("证券代码", securityCode);
                result.Add<string>("证券名称", securities.Get<string>("F2_0002", pointer));

                // 成交额求和
                result.Add<double>("成交额", quotation.Sum("F8_0001", list.GetEnumerator()));
            }

            // 转换为Json对象
            return result.ToJsonTree();
        }
    }
}
复制代码

通过Indexes和索引名访问索引容器,索引容器中提供相应的数据查询接口。

索引基类提供的接口,可以通过MeayunDB.dll查看,也可以从下载安装包中查看MeayunDB API.chm接口文档。

复制代码
using System;
using System.Collections.Generic;

namespace MeayunDB
{
    public abstract class BaseIndex
    {
        public BaseIndex();
        public BaseIndex(string name, string keys);

        public int Count { get; set; }
        public string[] Keys { get; }
        public string Name { get; }

        public virtual double Avg(string field, IEnumerator<int> enumerator);
        public IEnumerator<int> Filter();
        public virtual IEnumerator<int> Filter(JsonTree parameters);
        public IEnumerator<int> Filter(string where);
        public virtual IEnumerator<int> Filter(IEnumerator<int> enumerator, string where);
        public IEnumerator<int> Filter(string on, string where);
        public virtual object Get(string name, int pointer);
        public virtual TValue Get<TValue>(string name, int pointer);
        public virtual BaseColumn GetValue(string field, IEnumerator<int> enumerator);
        public virtual Column<TValue> GetValue<TValue>(string field, IEnumerator<int> enumerator);
        public Table Query();
        public virtual Table Query(IEnumerator<int> enumerator);
        public Table Query(JsonTree parameters);
        public Table Query(string where);
        public Table Query(string[] fields);
        public virtual Table Query(IEnumerator<int> enumerator, string where);
        public virtual Table Query(IEnumerator<int> enumerator, string[] fields);
        public Table Query(string on, string where);
        public Table Query(string where, string[] fields);
        public virtual Table Query(IEnumerator<int> enumerator, string where, string[] fields);
        public Table Query(string on, string where, string[] fields);
        public virtual double Sum(string field, IEnumerator<int> enumerator);
    }
}
复制代码

 

在具体业务开发中,开发人员只要继承BaseAction,业务均在DoAction中实现。开发简单,易于使用。开发完毕后,需要把action提交到MeayunDB的脚本目录中。

如下图,我启动的MeayunDB的脚本目录为scripts,把开发完毕的c#业务代码拷贝到scripts目录,重启服务,相应的业务就嵌入到数据库了。

MeayunDB的Action可以和关系型数据库的存储过程进行类比,Action就好比关系型数据库中的存储过程,通过Action名称和一些参数就能访问Action。

 

三、客户端访问
 
 

复制代码
/*
* Copyright (C) 2012-2013 上海密云信息科技有限公司 All rights reserved.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Data;
using Driver;

namespace RPC
{
class Program
{
/// <summary>
/// 首先添加Driver.dll的引用,然后在应用程序目录添加servers.xml
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 启动驱动器
Global.Start();

// 构造请求参数
JsonTree request = new JsonTree();
request.AddJsonString(
"action", "Amount");

抱歉!评论已关闭.