Example #1
0
        /// <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);
        }
Example #2
0
        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());
        }
Example #3
0
        //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);
            }
        }