Parcourir la source

HPCC-8932 Move getMinRecordSize() to IRecordSize

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday il y a 12 ans
Parent
commit
96cca11052

+ 5 - 0
common/fileview2/fvdisksource.cpp

@@ -400,6 +400,11 @@ size32_t CsvRecordSize::getFixedSize() const
 }
 
 
+size32_t CsvRecordSize::getMinRecordSize() const
+{
+    return unitSize;
+}
+
 DirectCsvDiskDataSource::DirectCsvDiskDataSource(IDistributedFile * _df, const char * _format)
 {
     df.set(_df);

+ 1 - 0
common/fileview2/fvdisksource.ipp

@@ -93,6 +93,7 @@ public:
     virtual size32_t getRecordSize(const void *rec);
     virtual size32_t getRecordSize(unsigned maxLength, const void *rec);
     virtual size32_t getFixedSize() const;
+    virtual size32_t getMinRecordSize() const;
 
     size32_t getRecordLength(size32_t maxLength, const void * start, bool includeTerminator);
 

+ 33 - 8
common/fileview2/fvsource.cpp

@@ -174,7 +174,7 @@ DataSourceMetaData::DataSourceMetaData(IHqlExpression * _record, byte _numFields
     gatherAttributes();
 
     if (isStoredFixedWidth)
-        assertex(storedFixedSize == maxRecordSize);
+        assertex(minRecordSize == maxRecordSize);
 }
 
 
@@ -200,7 +200,7 @@ DataSourceMetaData::DataSourceMetaData(type_t typeCode)
 void DataSourceMetaData::init()
 {
     keyedSize = 0;
-    storedFixedSize = 0;
+    minRecordSize = 0;
     maxRecordSize = 0;
     bitsRemaining = 0;
     numVirtualFields = 0;
@@ -215,7 +215,7 @@ DataSourceMetaData::DataSourceMetaData(MemoryBuffer & buffer)
     buffer.read(numFieldsToIgnore);
     buffer.read(randomIsOk);
     buffer.read(isStoredFixedWidth);
-    buffer.read(storedFixedSize);
+    buffer.read(minRecordSize);
     buffer.read(keyedSize);
     buffer.read(maxRecordSize);
 
@@ -249,20 +249,40 @@ void DataSourceMetaData::addSimpleField(const char * name, const char * xpath, I
     unsigned size = promoted->getSize();
     unsigned thisBits = 0;
     if (size == UNKNOWN_LENGTH)
+    {
         isStoredFixedWidth = false;
+        switch (type->getTypeCode())
+        {
+        case type_set:
+            minRecordSize += sizeof(bool) + sizeof(size32_t);
+            break;
+        case type_varstring:
+            minRecordSize += 1;
+            break;
+        case type_packedint:
+            minRecordSize += 1;
+            break;
+        case type_varunicode:
+            minRecordSize += sizeof(UChar);
+            break;
+        default:
+            minRecordSize += sizeof(size32_t);
+            break;
+        }
+    }
     else if (type->getTypeCode() == type_bitfield)
     {
         thisBits = type->getBitSize();
         if (thisBits > bitsRemaining)
         {
             size = type->queryChildType()->getSize();
-            storedFixedSize += size;
+            minRecordSize += size;
             bitsRemaining = size * 8;
         }
         bitsRemaining -= thisBits;
     }
     else
-        storedFixedSize += size;
+        minRecordSize += size;
     if (thisBits == 0)
         bitsRemaining = 0;
     fields.append(*new DataSourceMetaItem(FVFFnone, name, xpath, type));
@@ -519,7 +539,7 @@ void DataSourceMetaData::serialize(MemoryBuffer & buffer) const
     buffer.append(numFieldsToIgnore);
     buffer.append(randomIsOk);
     buffer.append(isStoredFixedWidth);
-    buffer.append(storedFixedSize);
+    buffer.append(minRecordSize);
     buffer.append(keyedSize);
     buffer.append(maxRecordSize);
 
@@ -534,7 +554,7 @@ void DataSourceMetaData::serialize(MemoryBuffer & buffer) const
 size32_t DataSourceMetaData::getRecordSize(const void *rec)
 {
     if (isStoredFixedWidth)
-        return storedFixedSize;
+        return minRecordSize;
     if (!rec)
         return maxRecordSize;
 
@@ -608,11 +628,16 @@ size32_t DataSourceMetaData::getRecordSize(const void *rec)
 size32_t DataSourceMetaData::getFixedSize() const
 {
     if (isStoredFixedWidth)
-        return storedFixedSize;
+        return minRecordSize;
     return 0;
 }
 
 
+size32_t DataSourceMetaData::getMinRecordSize() const
+{
+    return minRecordSize;
+}
+
 IFvDataSourceMetaData * deserializeDataSourceMeta(MemoryBuffer & in)
 {
     return new DataSourceMetaData(in);

+ 7 - 2
common/fileview2/fvsource.ipp

@@ -55,6 +55,10 @@ public:
     {
         return recordSize->getFixedSize();
     }
+    virtual size32_t getMinRecordSize() const
+    {
+        return recordSize->getMinRecordSize();
+    }
 private:
     Linked<IRecordSize> recordSize;
 };
@@ -118,7 +122,7 @@ public:
     void addVirtualField(const char * name, const char * xpath, ITypeInfo * type);
 
     void extractKeyedInfo(UnsignedArray & offsets, TypeInfoArray & types);
-    unsigned fixedSize() { return storedFixedSize; }
+    unsigned fixedSize() { return minRecordSize; }
     bool isFixedSize() { return isStoredFixedWidth; }
     bool isSingleSet() { return ((fields.ordinality() == 1) && (fields.item(0).type->getTypeCode() == type_set)); }
     inline unsigned getMaxRecordSize()                      { return maxRecordSize; }
@@ -131,6 +135,7 @@ public:
     {
         return getRecordSize(rec);
     }
+    virtual size32_t getMinRecordSize() const;
 
 protected:
     void addSimpleField(const char * name, const char * xpath, ITypeInfo * type);
@@ -144,7 +149,7 @@ protected:
     CIArrayOf<DataSourceMetaItem> fields;
     IntArray attributes;
     unsigned keyedSize;
-    unsigned storedFixedSize;
+    unsigned minRecordSize;
     unsigned maxRecordSize;
     unsigned bitsRemaining;
     unsigned numVirtualFields;

+ 4 - 0
common/thorhelper/roxiehelper.cpp

@@ -254,6 +254,10 @@ size32_t CRHDualCache::getFixedSize() const
     return in->queryOutputMeta()->getFixedSize();
 }
 
+size32_t CRHDualCache::getMinRecordSize() const
+{
+    return in->queryOutputMeta()->getMinRecordSize();
+}
 
 CRHDualCache::cOut::cOut(CRHDualCache *_parent, unsigned &_pos) 
 : pos(_pos)

+ 6 - 2
common/thorhelper/roxielmj.hpp

@@ -90,8 +90,12 @@ public:
 #endif
 
     bool get(unsigned n, CRHRollingCacheElem *&out);
-    size32_t getRecordSize(const void *ptr);
-    size32_t getFixedSize() const;
+
+    //interface IRecordSize:
+    virtual size32_t getRecordSize(const void *ptr);
+    virtual size32_t getFixedSize() const;
+    virtual size32_t getMinRecordSize() const;
+
     class cOut: public CInterface, public IInputBase
     {
     private:

+ 1 - 0
roxie/ccd/ccdkey.cpp

@@ -1983,6 +1983,7 @@ protected:
             IMPLEMENT_IINTERFACE;
             virtual size32_t getRecordSize(const void *) { return sizeof(unsigned); }
             virtual size32_t getFixedSize() const { return sizeof(unsigned); }
+            virtual size32_t getMinRecordSize() const { return sizeof(unsigned); }
         } x;
         unsigned testarray[] = {1,2,2,2,4,3,8,9,0,5};
         InMemoryIndex di;

+ 1 - 1
rtl/include/eclhelper.hpp

@@ -143,6 +143,7 @@ interface IRecordSize : public IInterface
 {
     virtual size32_t getRecordSize(const void *rec) = 0;
     virtual size32_t getFixedSize() const = 0;
+    virtual size32_t getMinRecordSize() const = 0;
     inline bool isFixedSize()      const { return getFixedSize()!=0; }
     inline bool isVariableSize()   const { return getFixedSize()==0; }
 };
@@ -390,7 +391,6 @@ interface IOutputMetaData : public IRecordSize
     inline bool isGrouped()                 { return (getMetaFlags() & MDFgrouped) != 0; }
     inline bool hasXML()                    { return (getMetaFlags() & MDFhasxml) != 0; }
 
-    virtual size32_t getMinRecordSize() const = 0;
     virtual void toXML(const byte * self, IXmlWriter & out) = 0;
     virtual unsigned getVersion() const = 0;
     virtual unsigned getMetaFlags() = 0;

+ 0 - 21
system/jhtree/keydiff.cpp

@@ -348,25 +348,6 @@ class CKeyFileReader: public CInterface, extends IKeyFileRowReader
     Owned<IPropertyTree> header;
     RowBuffer buffer;
 
-    class cRecSize: public CInterface, implements IRecordSize
-    {
-    public:
-        IMPLEMENT_IINTERFACE;
-        size32_t frecsize;
-        size32_t maxrecsize;
-        size32_t getRecordSize(const void *rec)
-        {
-            if (!rec)
-                return maxrecsize;
-            return frecsize?frecsize:((*((const size32_t *)rec)+sizeof(size32_t)+sizeof(offset_t)));
-        }
-        size32_t getFixedSize() const
-        {
-            return frecsize;
-        }
-
-    } crecsize;
-
 public:
     IMPLEMENT_IINTERFACE;
     CKeyFileReader(const char *filename)
@@ -375,8 +356,6 @@ public:
         size32_t rowsize = reader.queryRowSize();
         bool isvar = reader.isVariableWidth();
         buffer.init(rowsize,isvar);
-        crecsize.maxrecsize = buffer.buffSize();
-        crecsize.frecsize = isvar?0:crecsize.maxrecsize;
 
         header.setown(createPTree("Index"));
         header->setPropInt("@rowSize",rowsize);

+ 10 - 2
system/jlib/jio.cpp

@@ -630,7 +630,11 @@ public:
     {
         return recsize;
     }
-    size32_t getFixedSize() const
+    virtual size32_t getFixedSize() const
+    {
+        return recsize;
+    }
+    virtual size32_t getMinRecordSize() const
     {
         return recsize;
     }
@@ -655,10 +659,14 @@ public:
     {
         return recordSize->getRecordSize(data) + delta;
     }
-    size32_t getFixedSize() const
+    virtual size32_t getFixedSize() const
     {
         return recordSize->getFixedSize()?recordSize->getFixedSize()+delta:0;
     }
+    virtual size32_t getMinRecordSize() const
+    {
+        return recordSize->getMinRecordSize() + delta;
+    }
 };
 
 extern jlib_decl IRecordSize *createDeltaRecordSize(IRecordSize * size, int delta)

+ 2 - 0
system/jlib/jio.hpp

@@ -36,6 +36,8 @@ interface IRecordSize: public IInterface
        //passing NULL to getRecordSize returns size for fixed records and initial size for variable
     virtual size32_t getFixedSize() const = 0;                      
        // returns 0 for variable row size
+    virtual size32_t getMinRecordSize() const = 0;
+       // The minimum size that a variable (or fixed) size record can be.
 
     inline bool isFixedSize()      const { return getFixedSize()!=0; }
     inline bool isVariableSize()   const { return getFixedSize()==0; }