/// <summary> /// Get key for the values of group by feilds /// </summary> /// <param name="docid"></param> /// <returns></returns> unsafe private ulong GetKey(ref Query.DocumentResultForSort result) { int *payloadData = result.PayloadData; int docid = result.DocId; if (payloadData == null) { payloadData = _DBProvider.GetPayloadData(docid); result.PayloadData = payloadData; } ulong key = 0; if (payloadData == null) { throw new ParseException(string.Format("docid={0} does not exist", docid)); } foreach (Field field in _DistinctFields) { switch (field.DataType) { case DataType.TinyInt: { sbyte data = DataTypeConvert.GetSByte(field.DataType, payloadData, field.TabIndex, field.SubTabIndex, field.DataLength); key <<= 8; key += (byte)data; break; } case DataType.SmallInt: { short data = DataTypeConvert.GetShort(field.DataType, payloadData, field.TabIndex, field.SubTabIndex, field.DataLength); key <<= 16; key += (ushort)data; break; } case DataType.Int: case DataType.Date: case DataType.SmallDateTime: { int data = DataTypeConvert.GetInt(field.DataType, payloadData, field.TabIndex, field.SubTabIndex, field.DataLength); key <<= 32; key += (uint)data; break; } case DataType.BigInt: case DataType.DateTime: { long data = DataTypeConvert.GetLong(field.DataType, payloadData, field.TabIndex, field.SubTabIndex, field.DataLength); key = (ulong)data; break; } } } return(key); }
unsafe private string GetInSql(Data.DBProvider dbProvider, Query.DocumentResultForSort[] result, int begin, int count) { if (begin + count > result.Length) { return(null); } StringBuilder sql = new StringBuilder(); if (dbProvider.DocIdReplaceField == null) { sql.Append("docId in ("); } else { sql.AppendFormat("{0} in (", dbProvider.DocIdReplaceField); } Dictionary <long, int> replaceFieldValueToDocId = null; if (dbProvider.DocIdReplaceField != null) { replaceFieldValueToDocId = new Dictionary <long, int>(); } int i = 0; for (int j = begin; j < begin + count; j++) { Query.DocumentResultForSort docResult = result[j]; int docId = docResult.DocId; if (dbProvider.DocIdReplaceField == null) { if (i++ == 0) { sql.AppendFormat("{0}", docId); } else { sql.AppendFormat(",{0}", docId); } } else { long replaceFieldValue = dbProvider.GetDocIdReplaceFieldValue(docId); if (i++ == 0) { sql.AppendFormat("{0}", replaceFieldValue); } else { sql.AppendFormat(",{0}", replaceFieldValue); } } } sql.Append(")"); return(sql.ToString()); }
//Partition for QueryResultSort private int PartitionDocumentResult(Query.DocumentResultForSort[] array, int low, int high, int pivotIndex) { if (_Asc) { Query.DocumentResultForSort pivotValue = array[pivotIndex]; array[pivotIndex] = array[low]; array[low] = pivotValue; while (low < high) { while (array[high].SortValue >= pivotValue.SortValue && high > low) { --high; } if (high > low) { array[low] = array[high]; } while (array[low].SortValue <= pivotValue.SortValue && high > low) { ++low; } if (high > low) { array[high] = array[low]; } } array[low] = pivotValue; return(low); } else { Query.DocumentResultForSort pivotValue = array[pivotIndex]; array[pivotIndex] = array[low]; array[low] = pivotValue; while (low < high) { while (array[high].SortValue <= pivotValue.SortValue && high > low) { --high; } if (high > low) { array[low] = array[high]; } while (array[low].SortValue >= pivotValue.SortValue && high > low) { ++low; } if (high > low) { array[high] = array[low]; } } array[low] = pivotValue; return(low); } }