示例#1
0
        public MongoCollection <TEntity> GetCollection <TEntity>(ShardParams shardParams)
        {
            var strategy = RepositoryFramework.GetShardStrategy(typeof(TEntity));

            if (strategy == null)
            {
                throw new ArgumentNullException("strategy", String.Format("无法找到类型 {0} 对应的分区策略信息。", typeof(TEntity).FullName));
            }

            var shardId     = strategy.GetShardId(shardParams);
            var partitionId = strategy.GetPartitionId(shardParams);

            var database = GetDatabase(shardId);

            if (partitionId == null)
            {
                var metadata = RepositoryFramework.GetDefineMetadata(typeof(TEntity));
                if (metadata != null && !String.IsNullOrEmpty(metadata.Table))
                {
                    return(database.GetCollection <TEntity>(metadata.Table));
                }

                return(database.GetCollection <TEntity>(typeof(TEntity).Name));
            }
            return(database.GetCollection <TEntity>(partitionId.RealTableName));
        }
示例#2
0
 internal LinqSpecification(ISpecificationProvider provider, ShardParams shardParams, Expression <Func <T, bool> > expr)
 {
     this.provider           = provider;
     this.criteriaExpression = expr;
     this.shardParams        = shardParams;
     this.thenByExpressions  = new List <QueryOrderExpression>();
 }
示例#3
0
        public ISpecification <T> Shard <T>(ISpecification <T> spec, ShardParams shardParams)
        {
            LinqSpecification <T> linqSpec = (LinqSpecification <T>)spec;

            linqSpec.ShardParams = shardParams;
            return(linqSpec);
        }
        public ISpecification <T> Shard <T>(ISpecification <T> spec, ShardParams shardParams)
        {
            NHibernateSpecification <T> nhSpec = (NHibernateSpecification <T>)spec;

            nhSpec.ShardParams = shardParams;
            return(nhSpec);
        }
示例#5
0
        public ISpecification <T> Shard <T>(ISpecification <T> spec, ShardParams shardParams)
        {
            IBatisNetSpecification <T> batisSpec = (IBatisNetSpecification <T>)spec;

            spec.Shard(shardParams);
            return(batisSpec);
        }
        public ISpecification <T> Shard <T>(ISpecification <T> spec, ShardParams shardParams)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;

            mongoSpec.ShardParams = shardParams;
            return(mongoSpec);
        }
        public virtual IList <T> GetList <T>(ShardParams shardParams, IEnumerable ids)
        {
            Trace <T>("GetList", "{\"_id\": [" + String.Join(",", ids) + "]}");
            IMongoQuery query = Query.In("_id", BsonArray.Create(ids));

            return(GetCollection <T>(shardParams).FindAs <T>(query).ToList());
        }
 internal IBatisNetSpecification(ISpecificationProvider provider, ShardParams shardParams,
                                 Expression <Func <T, bool> > expr)
 {
     this.mProvider           = provider;
     this.mShardParams        = shardParams;
     this.mCriteriaExpression = expr;
 }
示例#9
0
        public static ISession GetSession <TEntity>(this AbstractUserShardRepository <TEntity> repository, long userId) where
        TEntity : class
        {
            var nr = (AbstractRepository <TEntity>)repository;

            return(((NHibernateShardSession <TEntity>)nr.OpenSession(ShardParams.Form(userId))).InnerSession);
        }
示例#10
0
 /// <summary>
 /// 定义规约的分区分表参数
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="spec"></param>
 /// <param name="shardParam"></param>
 /// <returns></returns>
 public static ISpecification <T> Shard <T>(this ISpecification <T> spec, long shardParam1, long shardParam2)
 {
     if (spec == null)
     {
         throw new ArgumentNullException("spec");
     }
     return(spec.Provider.Shard(spec, ShardParams.Form(shardParam1, shardParam2)));
 }
示例#11
0
        public void Update <T>(ShardParams shardParams, T entity)
        {
            var getter = BsonClassMap.LookupClassMap(typeof(T)).IdMemberMap.Getter;

            Trace <T>("Update", "{\"_id\":\"" + getter(entity).ToString() + "\"}");

            GetCollection <T>(shardParams).Save <T>(entity, safeMode);
        }
示例#12
0
        public void Delete <T>(ShardParams shardParams, T entity)
        {
            var getter = BsonClassMap.LookupClassMap(typeof(T)).IdMemberMap.Getter;
            var id     = getter(entity);

            Trace <T>("Delete", "{\"_id\":\"" + getter(entity).ToString() + "\"}");

            GetCollection <T>(shardParams).Remove(Query.EQ("_id", BsonValue.Create(id)), safeMode);
        }
示例#13
0
        public virtual IList <TEntity> GetList(ShardParams shardParams, IEnumerable ids)
        {
            if (!ids.GetEnumerator().MoveNext())
            {
                return(new List <TEntity>());
            }

            return(OpenSession(shardParams).GetList(ids));
        }
示例#14
0
        public void AddToSet <TEntity, TSet>(ShardParams shardParams, TEntity entity, Expression <Func <TEntity, object> > expr, IEnumerable <TSet> setIds)
        {
            var classMap = BsonClassMap.LookupClassMap(typeof(TEntity));
            //查询条件
            var query = Query.EQ(classMap.IdMemberMap.ElementName, BsonValue.Create(classMap.IdMemberMap.Getter(entity)));
            //需要批量更新的字段名
            var setName = classMap.GetMemberMap((expr.Body as MemberExpression).Member.Name).ElementName;
            //执行的更新语句
            var update = MongoDB.Driver.Builders.Update.AddToSetEachWrapped <TSet>(setName, setIds);

            //执行语句
            GetCollection <TEntity>(shardParams).Update(query, update, SafeMode.True);
        }
        public override PartitionId GetPartitionId(ShardParams shardParams)
        {
            var      v       = param2 ? shardParams.Param2 : shardParams.Param1;
            DateTime nowtime = DateTimeExtend.FromUnixTime(v);
            string   tid;

            if (!debug)
            {
                tid = nowtime.Year.ToString() + nowtime.Month.ToString().PadLeft(2, '0');
            }
            else
            {
                tid = "00";
            }
            return(new PartitionId(table, String.Format(format, tid)));
        }
        public IShardSession <TEntity> OpenSession <TEntity>(ShardParams shardParams)
        {
            var strategy = RepositoryFramework.GetShardStrategy(typeof(TEntity));

            if (strategy == null)
            {
                throw new ArgumentNullException("strategy", String.Format("无法找到类型 {0} 对应的分区策略信息。", typeof(TEntity).FullName));
            }

            var shardId     = strategy.GetShardId(shardParams);
            var partitionId = strategy.GetPartitionId(shardParams);

            using (var scope = ProfilerContext.Profile("open nhibernate session"))
            {
                var session = manager.OpenSession(shardId, partitionId);
                return(new NHibernateShardSession <TEntity>(session));
            }
        }
示例#17
0
        /// <summary>
        /// expr为获取 lockVersion的表达式
        /// LockValue从1开始。0用来兼容旧的数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="entity"></param>
        /// <param name="expr"></param>
        /// <returns></returns>
        public bool UpdateForOptimisticLock <T>(ShardParams shardParams, T entity, Expression <Func <T, byte> > expr, Func <T, bool> newFunc)
        {
            if (newFunc(entity))
            {
                Create(shardParams, entity);
                return(true);
            }
            else
            {
                var classMap       = BsonClassMap.LookupClassMap(typeof(T));
                var lockVersionMap = classMap.GetMemberMap((expr.Body as MemberExpression).Member.Name);
                var oldLockValue   = Convert.ToByte(lockVersionMap.Getter(entity));
                var newLockValue   = oldLockValue == byte.MaxValue ? 1 : oldLockValue + 1;
                //query
                var mongoQuery = new List <IMongoQuery> {
                };
                mongoQuery.Add(Query.EQ(classMap.IdMemberMap.ElementName, BsonValue.Create(classMap.IdMemberMap.Getter(entity))));
                if (oldLockValue != 0)
                {
                    mongoQuery.Add(Query.EQ(lockVersionMap.ElementName, (byte)lockVersionMap.Getter(entity)));
                }
                var query = Query.And(mongoQuery.ToArray());
                //update
                UpdateBuilder update = MongoDB.Driver.Builders.Update.Set(lockVersionMap.ElementName, newLockValue);
                foreach (var memberMap in classMap.MemberMaps)
                {
                    if (memberMap.ElementName != classMap.IdMemberMap.ElementName && memberMap.ElementName != lockVersionMap.ElementName)
                    {
                        update = update.Set(memberMap.ElementName, BsonValue.Create((memberMap.Getter(entity))));
                    }
                }

                //mongoDB语句跟踪
                Trace <T>("UpdateForOptimisticLock", "{\"_id\":\"" + classMap.IdMemberMap.Getter(entity).ToString() + "\",\"lockVersion\":\"" + oldLockValue + "\"}");

                var result = GetCollection <T>(shardParams).FindAndModify(query, SortBy.Null, update, false, false);
                return(!(result.Response.GetValue(0) is BsonNull));
            }
        }
 /// <summary>
 /// 打开一个 IShardSession 实例
 /// </summary>
 /// <typeparam name="TEntity"></typeparam>
 /// <param name="shardParams"></param>
 /// <returns></returns>
 public static IShardSession <TEntity> OpenSession <TEntity>(ShardParams shardParams)
 {
     return(frameworkConfiguation.GetSessionFactory(typeof(TEntity), true).OpenSession <TEntity>(shardParams));
 }
示例#19
0
        public static ISession GetSession <TEntity>(this AbstractRepository <TEntity> repository, ShardParams shardParams) where
        TEntity : class
        {
            var nr = (AbstractRepository <TEntity>)repository;

            return(((NHibernateShardSession <TEntity>)nr.OpenSession(shardParams)).InnerSession);
        }
示例#20
0
 public override ShardId GetShardId(ShardParams shardParams)
 {
     return(shardId);
 }
示例#21
0
 public override PartitionId GetPartitionId(ShardParams shardParams)
 {
     return(null);
 }
示例#22
0
 public virtual ISpecification <TEntity> CreateSpecification(long userId)
 {
     return(CreateSpecification(ShardParams.Form(userId)));
 }
示例#23
0
 public virtual TEntity Get(int courseId, object id)
 {
     return(Get(ShardParams.Form(courseId), id));
 }
示例#24
0
 public virtual TEntity Get(long userId, object id)
 {
     return(Get(ShardParams.Form(userId), id));
 }
 public IShardSession <TEntity> OpenSession <TEntity>(ShardParams shardParams)
 {
     return(new MongoShardSession <TEntity>(new MongoSession(mongoManager), shardParams));
 }
 public override ShardId GetShardId(ShardParams shardParams)
 {
     return(new ShardId(shard));
 }
示例#27
0
 public HasManyByForeignKeyDefine Shard(long param1, long param2)
 {
     ShardParams = ShardParams.Form(param1, param2);
     return(this);
 }
示例#28
0
 public virtual IList <TEntity> GetList(long userId, System.Collections.IEnumerable ids)
 {
     return(GetList(ShardParams.Form(userId), ids));
 }
示例#29
0
 public abstract PartitionId GetPartitionId(ShardParams shardParams);
示例#30
0
 public abstract ShardId GetShardId(ShardParams shardParams);