Dictionary <int, List <List <long> > > idDict = new Dictionary <int, List <List <long> > >(); //收集cellid消息 #region 邹开发 select public override void SelectFromClientHandler(SelectMessageReader request, SelectResponseWriter response) { idDict.Clear(); for (int i = 0; i < Global.ServerCount; i++) { //每个服务器挨个发送 SelectMessageWriter smw = new SelectMessageWriter(request.columnNameList, request.columnTypeList, request.cellIds, request.usedIndex, request.condition); Global.CloudStorage.SelectFromProxyToDatabaseServer(i, smw); } sem.WaitOne(); //等待服务器全部返回信息 response.cellIds = new List <List <long> >(); //将信息合并 for (int i = 0; i < Global.ServerCount; i++) { response.cellIds.AddRange(idDict[i]); } }
/// <summary> /// 无into的select语句 /// </summary> /// <param name="fields">三元组数组,第一个表示字段,第二个表示别名</param> /// <param name="con">条件表达式</param> /// <returns></returns> public Table select(Tuple <string, string>[] fields, string con) { //新表的结构 List <string> newColumnNames = new List <string>(); List <int> newColumnTypes = new List <int>(); List <int> usedIndexes = new List <int>(); //标记被select的索引 //先检查字段是否符合 if (fields.Length == 1 && fields[0].Item1.Equals("*")) { newColumnNames = columnNames; newColumnTypes = columnTypes; } else { foreach (Tuple <string, string> field in fields) { string fieldName = field.Item1; //字段名 if (columnNames.Contains(fieldName)) //直接能识别出该字段 { newColumnNames.Add((field.Item2 == null) || (field.Item2.Equals("")) ? fieldName : field.Item2); //别名 newColumnTypes.Add(columnTypes[columnNames.IndexOf(fieldName)]); usedIndexes.Add(columnNames.IndexOf(fieldName)); } else //说明要么该字段不存在,要么没有使用表名直接使用字段名 { int count = 0; int fieldIndex = 0; for (int i = 0; i < columnNames.Count; i++) { if (columnNames.Contains("." + fieldName)) //统计是否重复了 { count++; fieldIndex = i; } } if (count == 0) { throw new Exception(String.Format("字段{0}不存在", fieldName)); } else if (count > 1) { throw new Exception(String.Format("字段{0}重复,需要指明表名", fieldName)); } else { newColumnNames.Add((field.Item2 == null) || (field.Item2.Equals("")) ? columnNames[fieldIndex] : field.Item2); //别名 newColumnTypes.Add(fieldIndex); usedIndexes.Add(fieldIndex); } } } } usedIndexes.Sort(); //此时,新表的结构构建完成,向proxy发送查询任务 SelectMessageWriter smw = new SelectMessageWriter(columnNames, columnTypes, cellIds, usedIndexes, con); List <List <long> > newCellIds = Global.CloudStorage.SelectFromClientToDatabaseProxy(0, smw).cellIds; return(new Table(newCellIds, newColumnTypes, newColumnNames, this.primaryIndexs, this.defaultValues, this.tableNames)); }