All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dell.doradus.logservice.ChunkField Maven / Gradle / Ivy

The newest version!
package com.dell.doradus.logservice;

import com.dell.doradus.common.Utils;
import com.dell.doradus.logservice.search.StrRef;
import com.dell.doradus.logservice.store.Temp;
import com.dell.doradus.olap.collections.MemoryStream;
import com.dell.doradus.olap.io.BSTR;

public class ChunkField {
    private int m_size;
    private int m_fieldIndex;
    private MemoryStream m_input;
    private MemoryStream m_data;
    private BSTR m_fieldName;
    private int m_valuesOffset;
    private int m_valuesCount;
    private int m_indexesOffset;
    private int[] m_offsets;
    private int[] m_lengths;
    private int[] m_prefixes;
    private int[] m_suffixes;
    private int[] m_indexes;
    private SyntheticFields m_synth;
    
    public ChunkField(int size, int fieldIndex, MemoryStream input, MemoryStream data) {
        m_size = size;
        m_fieldIndex = fieldIndex;
        m_input = input;
        m_data = data;
        
        m_fieldName = new BSTR(m_input.readString());
        m_valuesCount = m_input.readVInt();
        
        m_valuesOffset = m_input.position();
        Temp.skipCompressed(m_input);
        Temp.skipCompressed(m_input);
        Temp.skipCompressed(m_input);
        Temp.skipCompressed(m_input);
        
        m_indexesOffset = m_input.position();
        if(m_valuesCount >= 256) {
            Temp.skipCompressed(m_input);
            Temp.skipCompressed(m_input);
        } else {
            Temp.skipCompressed(m_input);
        }
    }

    public ChunkField(SyntheticFields synth, BSTR fieldName, int fieldIndex, MemoryStream data) {
        m_synth = synth;
        m_fieldIndex = fieldIndex;
        m_data = data;
        m_fieldName = fieldName;
    }
    
    
    public void readValues() {
        if(m_offsets != null) return;
        
        if(m_synth != null) {
            m_synth.createFields();
            return;
        }
        
        m_data.seek(m_data.length());
        m_input.seek(m_valuesOffset);
        m_offsets = new int[m_valuesCount];
        m_lengths = new int[m_valuesCount];
        m_prefixes = new int[m_valuesCount];
        m_suffixes = new int[m_valuesCount];
        
        MemoryStream s_pfx = Temp.readCompressed(m_input);
        MemoryStream s_sfx = Temp.readCompressed(m_input);
        MemoryStream s_len = Temp.readCompressed(m_input);
        MemoryStream s_dat = Temp.readCompressed(m_input);
        
        int lastPos = m_data.position();
        int lastLen = 0;
        for(int i = 0; i < m_valuesCount; i++) {
            int pfx = s_pfx.readVInt();
            int sfx = s_sfx.readVInt();
            int len = s_len.readVInt();
            m_offsets[i] = m_data.position();
            m_lengths[i] = len;
            m_prefixes[i] = pfx;
            m_suffixes[i] = sfx;
            int ifx = len - sfx - pfx;
            if(pfx > 0) m_data.write(m_data.getBuffer(), lastPos, pfx);
            if(ifx > 0) {
                m_data.write(s_dat.getBuffer(), s_dat.position(), ifx);
                s_dat.skip(ifx);
            }
            if(sfx > 0) m_data.write(m_data.getBuffer(), lastPos + lastLen - sfx, sfx);
            lastPos = m_offsets[i];
            lastLen = len;
        }
    }
    
    public void readIndexes() {
        if(m_indexes != null) return;
        
        if(m_synth != null) {
            m_synth.createFields();
            return;
        }
        
        m_indexes = new int[m_size];
        m_input.seek(m_indexesOffset);
        if(m_valuesCount >= 256) {
            MemoryStream s_lst = Temp.readCompressed(m_input);
            MemoryStream s_fst = Temp.readCompressed(m_input);
            for(int i = 0; i < m_size; i++) {
                int n = (s_fst.readVInt() << 8) + s_lst.readByte();
                m_indexes[i] = n;
            }
        } else {
            MemoryStream s_lst = Temp.readCompressed(m_input);
            for(int i = 0; i < m_size; i++) {
                int n = s_lst.readByte();
                m_indexes[i] = n;
            }
        }
    }
    

    //for synthetic fields
    public void set(int[] indexes, int[] offsets, int[] lengths) {
        m_size = indexes.length;
        m_valuesCount = offsets.length;
        m_offsets = offsets;
        m_lengths = lengths;
        m_prefixes = new int[offsets.length];
        m_suffixes = new int[offsets.length];
        m_indexes = indexes;
    }
    
    
    public int size() { return m_size; }
    
    public byte[] getBuffer() { return m_data.getBuffer(); }
    
    public BSTR getFieldName() { return m_fieldName; }
    
    public int getFieldIndex() { return m_fieldIndex; }
    
    public int getValuesCount() {
        if(m_synth != null) readValues();
        return m_valuesCount;
    }
    
    public int[] getOffsets() { 
        readValues();
        return m_offsets;
    }
    
    public int[] getLengths() {
        readValues();
        return m_lengths;
    }
    
    public int[] getPrefixes() {
        readValues();
        return m_prefixes;
    }
    
    public int[] getSuffixes() {
        readValues();
        return m_suffixes;
    }
    
    public int[] getIndexes() {
        readIndexes();
        return m_indexes;
    }
    
    
    public void getFieldValue(int doc, BSTR value) {
        readValues();
        readIndexes();
        int index = m_indexes[doc];
        value.length = 0;
        m_data.seek(m_offsets[index]);
        int len = m_lengths[index];
        value.assertLength(len);
        m_data.read(value.buffer, 0, len);
        value.length = len;
    }

    public String getFieldValue(int doc) {
        readValues();
        readIndexes();
        int index = m_indexes[doc];
        return Utils.toString(m_data.getBuffer(), m_offsets[index], m_lengths[index]);
    }

    public void getFieldValue(int doc, StrRef value) {
        readValues();
        readIndexes();
        int index = m_indexes[doc];
        value.set(m_data.getBuffer(), m_offsets[index], m_lengths[index]);
    }

    public void getValue(int valueNumber, StrRef value) {
        readValues();
        value.set(m_data.getBuffer(), m_offsets[valueNumber], m_lengths[valueNumber]);
    }
    
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy