BOOST_FOREACH(const CMap::value_type &vt, keep_columns) {
            string field_name(vt.first.substr(2));
            string output_field_xml;

            if (prefixequal(vt.first, "a.") && a_name_to_val_pos.exists(field_name)) { // case 1
                TINVARIANT(a_series.getTypePtr()->hasColumn(field_name));
                output_field_xml = renameField(a_series.getTypePtr(), field_name, vt.second);
                extractors.push_back
                        (ExtractorValue::make(vt.second, a_name_to_val_pos[field_name]));
            } else if (prefixequal(vt.first, "a.") 
                       && eq_columns.find(field_name) != eq_columns.end()) { // case 2a
                const string b_field_name(eq_columns.find(field_name)->second);
                TINVARIANT(b_series.getTypePtr()->hasColumn(b_field_name));
                output_field_xml = renameField(a_series.getTypePtr(), field_name, vt.second);
                GeneralField::Ptr b_field(GeneralField::make(b_series, b_field_name));
                extractors.push_back(ExtractorField::make(vt.second, b_field));
            } else if (prefixequal(vt.first, "b.")
                       && b_series.getTypePtr()->hasColumn(field_name)) { // case 2b
                output_field_xml = renameField(b_series.getTypePtr(), field_name, vt.second);
                GeneralField::Ptr b_field(GeneralField::make(b_series, field_name));
                extractors.push_back(ExtractorField::make(vt.second, b_field));
            } else {
                requestError("invalid extraction");
            }
            output_xml.append(output_field_xml);
        }
Exemple #2
0
template<typename INT> uint32_t test_int_type(const string &type) {
    typedef INT test_int_t;
    HashMap<test_int_t, uint32_t> hm;

    typedef map<test_int_t, uint32_t> stdmap_t;
    typedef typename stdmap_t::iterator iterator_t;
    stdmap_t stdmap;

    static const unsigned max_ents = 1000;

    {
	for(unsigned i = 0; i < max_ents; ++i) {
	    test_int_t k = static_cast<test_int_t>(rng.randLongLong());
	    uint32_t v = rng.randInt();
	    hm[k] = v;
	    stdmap[k] = v;
	    SINVARIANT(hm.size() == stdmap.size());
	}
    }

    {
	// test overwrite;
	for(iterator_t i = stdmap.begin();
	    i != stdmap.end(); ++i) {
	    SINVARIANT(hm[i->first] == i->second);
	    hm[i->first] = i->second;
	}

	SINVARIANT(hm.size() == stdmap.size());
    }

    uint32_t ret = 0;
    {
	// test removal
	while(!stdmap.empty()) {
	    iterator_t i = stdmap.begin();
	    test_int_t k = i->first;
	    uint32_t v = i->second;

	    ret ^= k ^ v;
	    SINVARIANT(hm[k] == v);
	    hm.remove(k);
	    if (!hm.exists(k + max_ents)) {
		// had a bug where removal of non-existent things gave
		// incorrect size count.  However, removal of
		// something that actually exists (low probability,
		// but possible) gives an error on hm vs stdmap size.
		hm.remove(k + max_ents, false);
	    }
	    stdmap.erase(i);
	    INVARIANT(hm.size() == stdmap.size(), format("%d != %d") % hm.size() % stdmap.size());
	}
	SINVARIANT(hm.size() == 0);
    }
    cout << format("Finished testing int type %s hash-val %u\n")
	% type % ret;
    return ret;
}