columnarmisc.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. //
  2. // Copyright (c) 2021-2026, Manticore Software LTD (https://manticoresearch.com)
  3. // All rights reserved
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License. You should have
  7. // received a copy of the GPL license along with this program; if you
  8. // did not, you can find it at http://www.gnu.org/
  9. //
  10. #include "columnarmisc.h"
  11. #include "schema/schema.h"
  12. #include "attribute.h"
  13. CSphVector<ScopedTypedIterator_t> CreateAllColumnarIterators ( const columnar::Columnar_i * pColumnar, const ISphSchema & tSchema )
  14. {
  15. CSphVector<ScopedTypedIterator_t> dIterators;
  16. if ( !pColumnar )
  17. return dIterators;
  18. for ( int i = 0; i < tSchema.GetAttrsCount(); i++ )
  19. {
  20. const CSphColumnInfo & tAttr = tSchema.GetAttr(i);
  21. if ( tAttr.IsColumnar() )
  22. {
  23. std::string sError;
  24. dIterators.Add ( { CreateColumnarIterator ( pColumnar, tAttr.m_sName.cstr(), sError ), tAttr.m_eAttrType } );
  25. assert ( dIterators.Last().first );
  26. }
  27. }
  28. return dIterators;
  29. }
  30. SphAttr_t SetColumnarAttr ( int iAttr, ESphAttr eType, columnar::Builder_i * pBuilder, std::unique_ptr<columnar::Iterator_i> & pIterator, RowID_t tRowID, CSphVector<int64_t> & dTmp )
  31. {
  32. switch ( eType )
  33. {
  34. case SPH_ATTR_UINT32SET:
  35. case SPH_ATTR_INT64SET:
  36. case SPH_ATTR_FLOAT_VECTOR:
  37. {
  38. const BYTE * pResult = nullptr;
  39. int iBytes = pIterator->Get ( tRowID, pResult );
  40. bool b32Bits = eType==SPH_ATTR_UINT32SET || eType==SPH_ATTR_FLOAT_VECTOR;
  41. int iValues = iBytes / ( b32Bits ? sizeof(DWORD) : sizeof(int64_t) );
  42. if ( b32Bits )
  43. {
  44. // need a 64-bit array as input. so we need to convert our 32-bit array to 64-bit entries
  45. dTmp.Resize(iValues);
  46. ARRAY_FOREACH ( i, dTmp )
  47. dTmp[i] = ((DWORD*)pResult)[i];
  48. pBuilder->SetAttr ( iAttr, dTmp.Begin(), iValues );
  49. }
  50. else
  51. pBuilder->SetAttr ( iAttr, (const int64_t*)pResult, iValues );
  52. }
  53. break;
  54. case SPH_ATTR_STRING:
  55. {
  56. const BYTE * pResult = nullptr;
  57. int iBytes = pIterator->Get ( tRowID, pResult);
  58. pBuilder->SetAttr ( iAttr, (const uint8_t*)pResult, iBytes );
  59. }
  60. break;
  61. default:
  62. {
  63. int64_t iValue = pIterator->Get(tRowID);
  64. pBuilder->SetAttr ( iAttr, iValue );
  65. return iValue;
  66. }
  67. }
  68. return 0;
  69. }
  70. void SetDefaultColumnarAttr ( int iAttr, const CSphColumnInfo & tAttr, columnar::Builder_i * pBuilder, CSphVector<int64_t> & dTmp )
  71. {
  72. switch ( tAttr.m_eAttrType )
  73. {
  74. case SPH_ATTR_UINT32SET:
  75. case SPH_ATTR_INT64SET:
  76. pBuilder->SetAttr ( iAttr, (const int64_t *)0, 0 );
  77. break;
  78. case SPH_ATTR_STRING:
  79. pBuilder->SetAttr ( iAttr, (const uint8_t *)0, 0 );
  80. break;
  81. case SPH_ATTR_FLOAT_VECTOR:
  82. if ( tAttr.IsIndexedKNN() )
  83. {
  84. dTmp.Resize ( tAttr.m_tKNN.m_iDims );
  85. dTmp.ZeroVec();
  86. pBuilder->SetAttr ( iAttr, dTmp.Begin(), dTmp.GetLength() );
  87. }
  88. else
  89. pBuilder->SetAttr ( iAttr, (const uint8_t *)0, 0 );
  90. break;
  91. default:
  92. pBuilder->SetAttr ( iAttr, 0 );
  93. break;
  94. }
  95. }
  96. CSphString ColumnarAttrType2Str ( common::AttrType_e eType )
  97. {
  98. switch ( eType )
  99. {
  100. case common::AttrType_e::NONE: return "none";
  101. case common::AttrType_e::UINT32: return "uint32";
  102. case common::AttrType_e::TIMESTAMP: return "timestamp";
  103. case common::AttrType_e::INT64: return "int64";
  104. case common::AttrType_e::UINT64: return "uint64";
  105. case common::AttrType_e::BOOLEAN: return "boolean";
  106. case common::AttrType_e::FLOAT: return "float";
  107. case common::AttrType_e::STRING: return "string";
  108. case common::AttrType_e::UINT32SET: return "uint32set";
  109. case common::AttrType_e::INT64SET: return "int64set";
  110. case common::AttrType_e::FLOATVEC: return "floatvec";
  111. default: return "unknown";
  112. }
  113. }
  114. PlainOrColumnar_t::PlainOrColumnar_t ( const CSphColumnInfo & tAttr, int iColumnar )
  115. {
  116. m_eType = tAttr.m_eAttrType;
  117. if ( tAttr.IsColumnar() )
  118. m_iColumnarId = iColumnar;
  119. else
  120. m_tLocator = tAttr.m_tLocator;
  121. }
  122. SphAttr_t PlainOrColumnar_t::Get ( RowID_t tRowID, const CSphRowitem * pRow, CSphVector<ScopedTypedIterator_t> & dIterators ) const
  123. {
  124. if ( m_iColumnarId>=0 )
  125. return dIterators[m_iColumnarId].first->Get(tRowID);
  126. return sphGetRowAttr ( pRow, m_tLocator );
  127. }
  128. int PlainOrColumnar_t::Get ( RowID_t tRowID, const CSphRowitem * pRow, const BYTE * pPool, CSphVector<ScopedTypedIterator_t> & dIterators, const uint8_t * & pData ) const
  129. {
  130. if ( m_iColumnarId>=0 )
  131. return dIterators[m_iColumnarId].first->Get ( tRowID, pData );
  132. int iLen = 0;
  133. pData = sphGetBlobAttr ( pRow, m_tLocator, pPool, iLen );
  134. return iLen;
  135. }