Beispiel #1
0
/*
 * Set the result vector with strings corresponding to the input string:
 * - If inputStr is partially or completely found in the keys, all the matching <key,words> are returned;
 * - If inputStr is partially or completely in the words, all the matching <key, words> are returned.
 * The following tags can modify the behaviour of the search algorithm:
 * - ^mystring returns mystring only if it is at the beginning of a key or word
 * - mystring$ returns mystring only if it is at the end of a key or word
 * All returned words are in UTF8.
 */
void CWordsDictionary::lookup( const CSString& inputStr, CVectorSString& resultVec ) const
{
	// Prepare search string
	if ( inputStr.empty() )
		return;

	CSString searchStr = inputStr;
	bool findAtBeginning = false, findAtEnd = false;
	if ( searchStr[0] == '^' )
	{
		searchStr = searchStr.substr( 1 );
		findAtBeginning = true;
	}
	if ( searchStr[searchStr.size()-1] == '$' )
	{
		searchStr = searchStr.rightCrop( 1 );
		findAtEnd = true;
	}

	// Search
	const vector<string> &vec = reinterpret_cast<const vector<string>&>(_Keys);
//	for ( CVectorSString::const_iterator ivs=_Keys.begin(); ivs!=_Keys.end(); ++ivs )
	for ( vector<string>::const_iterator ivs=vec.begin(); ivs!=vec.end(); ++ivs )
	{
		const CSString& key = *ivs;
		string::size_type p;
		if ( (p = key.findNS( searchStr.c_str() )) != string::npos )
		{
			if ( ((!findAtBeginning) || (p==0)) && ((!findAtEnd) || (p==key.size()-searchStr.size())) )
				resultVec.push_back( makeResult( key, _Words[ivs-vec.begin()] ) );
		}
	}
	for ( CVectorSString::const_iterator ivs=_Words.begin(); ivs!=_Words.end(); ++ivs )
	{
		const CSString& word = *ivs;
		string::size_type p;
		if ( (p = word.findNS( searchStr.c_str() )) != string::npos )
		{
			if ( ((!findAtBeginning) || (p==0)) && ((!findAtEnd) || (p==word.size()-searchStr.size())) )
				resultVec.push_back( makeResult( _Keys[ivs-_Words.begin()], word ) );
		}
	}
}
Beispiel #2
0
void MMSegmentation::splitSourceSegment()
{
	source_segment= getSourceSegment();
	
	//获取字典
	word_dictionary_map = new Word_Dictionary_Map();
	DataConvertor * dataconvertor = new DataConvertor();
	dataconvertor->convertDictionary(word_dictionary_map);

	result_segment_list = new Result_Segment_List();
	int wordlength = dataconvertor->getMaxWordLength();
	delete dataconvertor;
	
	int segmentlenth = this->source_segment.length();
	string source = this->source_segment;
	int begin=0;
	for(int i = 0 ; i < segmentlenth ; )
	{
		string temp = source.substr(i,wordlength);
		int returnlength = splitSourceSegment(temp);		
		i = returnlength +i;	
	}
	makeResult();
}
TEST_F(VirtualTableTests, test_constraints_stacking) {
  // Add two testing tables to the registry.
  Registry::add<pTablePlugin>("table", "p");
  Registry::add<kTablePlugin>("table", "k");
  auto dbc = SQLiteDBManager::get();

  {
    // To simplify the attach, just access the column definition directly.
    auto p = std::make_shared<pTablePlugin>();
    attachTableInternal("p", p->columnDefinition(), dbc->db());
    auto k = std::make_shared<kTablePlugin>();
    attachTableInternal("k", k->columnDefinition(), dbc->db());
  }

  QueryData results;
  std::string statement;
  std::map<std::string, std::string> expected;

  std::vector<std::pair<std::string, QueryData> > constraint_tests = {
      MP("select k.x from p, k", makeResult("x", {"1", "2", "1", "2"})),
      MP("select k.x from (select * from k) k2, p, k where k.x = p.x",
         makeResult("k.x", {"1", "1", "2", "2"})),
      MP("select k.x from (select * from k where z = 1) k2, p, k where k.x = "
         "p.x",
         makeResult("k.x", {"1", "2"})),
      MP("select k.x from k k1, (select * from p) p1, k where k.x = p1.x",
         makeResult("k.x", {"1", "1", "2", "2"})),
      MP("select k.x from (select * from p) p1, k, (select * from k) k2 where "
         "k.x = p1.x",
         makeResult("k.x", {"1", "1", "2", "2"})),
      MP("select k.x from (select * from p) p1, k, (select * from k where z = "
         "2) k2 where k.x = p1.x",
         makeResult("k.x", {"1", "2"})),
      MP("select k.x from k, (select * from p) p1, k k2, (select * from k "
         "where z = 1) k3 where k.x = p1.x",
         makeResult("k.x", {"1", "1", "2", "2"})),
      MP("select p.x from (select * from k where z = 1) k1, (select * from k "
         "where z != 1) k2, p where p.x = k2.x",
         makeResult("p.x", {"1"})),
      MP("select p.x from (select * from k, (select x as xx from k where x = "
         "1) k2 where z = 1) k1, (select * from k where z != 1) k2, p, k as k3 "
         "where p.x = k2.x",
         makeResult("p.x", {"1", "1"})),
  };

  for (const auto& test : constraint_tests) {
    QueryData results;
    queryInternal(test.first, results, dbc->db());
    EXPECT_EQ(results, test.second);
  }

  std::vector<QueryData> union_results = {
      makeResult("x", {"1", "2"}),   makeResult("k.x", {"1", "2"}),
      makeResult("k.x", {"1", "2"}), makeResult("k.x", {"1", "2"}),
      makeResult("k.x", {"1", "2"}), makeResult("k.x", {"1", "2"}),
      makeResult("k.x", {"1", "2"}), makeResult("p.x", {"1"}),
      makeResult("p.x", {"1"}),
  };

  size_t index = 0;
  for (const auto& test : constraint_tests) {
    QueryData results;
    queryInternal(test.first + " union " + test.first, results, dbc->db());
    EXPECT_EQ(results, union_results[index++]);
  }
}
Beispiel #4
0
/**
 * Main entry point.
 * @param argc
 *  The number of arguments.
 * @param argv
 *  The array containing all arguments.
 */
int
main(int argc, char *argv[])
{
    struct Address addr;
    char const *err = NULL;
    int minArg;

    if (argc < 3 || argc > 5) {
        return usage(argv[0]);
    }

    if (strcmp(argv[1], "isip") == 0) {
        if (argc == 3) {
            parseAddressWithoutMask(argv[2], &addr);
            return isValidAddress(&addr) ? 0 : 1;
        }
        else {
            return usage(argv[0]);
        }
    }

    if (strcmp(argv[1], "isipv4") == 0) {
        if (argc == 3) {
            parseAddressWithoutMask(argv[2], &addr);
            return addr.type == AF_INET ? 0 : 1;
        }
        else {
            return usage(argv[0]);
        }
    }

    if (strcmp(argv[1], "isipv6") == 0) {
        if (argc == 3) {
            parseAddressWithoutMask(argv[2], &addr);
            return addr.type == AF_INET6 ? 0 : 1;
        }
        else {
            return usage(argv[0]);
        }
    }

    if (strcmp(argv[1], "netmask") == 0) {
        if (argc == 3) {
            if (parseAddressWithMask(argv[2], &addr)) {
                convertCIDRToNetmask(&addr);
            }
            return makeResult(&addr, argv[2], FALSE);
        }
        else {
            return usage(argv[0]);
        }
    }

    if (strcmp(argv[1], "netmaskbits") == 0) {
        if (argc == 3) {
            if (parseAddressWithoutMask(argv[2], &addr)) {
                convertNetmaskToCIDR(&addr);
            }
            else {
                parseAddressWithMask(argv[2], &addr);
            }
            if (isValidAddress(&addr)) {
                printf("%u\n", addr.netmaskbits);
                return 0;
            }
            else {
                return makeResult(&addr, argv[2], FALSE);
            }
        }
        else {
            return usage(argv[0]);
        }
    }

    if (strcmp(argv[1], "combine") == 0) {
        minArg = 4;
    }
    else {
        minArg = 3;
    }

    if (argc < minArg || argc > minArg + 1) {
        return usage(argv[0]);
    }
    else if (argc == minArg) {
        parseAddressWithMask(argv[2], &addr);
        err = argv[2];
    }
    else {
        if (parseAddressWithoutMask(argv[2], &addr)) {
            struct Address mask;
            if (parseAddressWithoutMask(argv[3], &mask)
                    && convertNetmaskToCIDR(&mask)) {
                if (addr.type == mask.type) {
                    addr.netmaskbits = mask.netmaskbits;
                }
                else {
                    fprintf(stderr, "address and netmask must belong to the same address family\n");
                    return -ERR_INVALID_NETMASK + 1;
                }
            }
            else {
                err = argv[3];
                addr.type = mask.type == ERR_INVALID_ADDRESS
                    ? ERR_INVALID_NETMASK : mask.type;
            }
        }
        else if (parseAddressWithMask(argv[2], &addr)) {
            return usage(argv[0]);
        }
        else {
            err = argv[2];
        }
    }

    if (strcmp(argv[1], "canonicalize") == 0) {
        return makeResult(&addr, err, TRUE);
    }

    if (strcmp(argv[1], "network") == 0) {
        if (isValidAddress(&addr)) {
            convertCIDRToNetwork(&addr);
            err = argv[2];
        }
        return makeResult(&addr, err, FALSE);
    }

    if (strcmp(argv[1], "host") == 0) {
        if (isValidAddress(&addr)) {
            convertCIDRToHost(&addr);
            err = argv[2];
        }
        return makeResult(&addr, err, FALSE);
    }

    if (strcmp(argv[1], "broadcast") == 0) {
        if (addr.type == AF_INET6) {
            printf("ff02::1\n");
            return 0;
        }
        else {
            if (isValidAddress(&addr)) {
                convertCIDRToBroadcast(&addr);
                err = argv[2];
            }
            return makeResult(&addr, err, FALSE);
        }
    }

    if (strcmp(argv[1], "dnsrev") == 0) {
        if (isValidAddress(&addr) &&
                convertCIDRToNetwork(&addr)) {
            char *str = buildReverseDNSName(&addr);
            if (str) {
                printf("%s\n", str);
                free(str);
                return 0;
            }
            else {
                fprintf(stderr, "conversion to DNS name failed\n");
                return -ERR_DNS_CONVERSION_FAILED + 1;
            }
        }
        else {
            return makeResult(&addr, err, FALSE);
        }
    }

    if (strcmp(argv[1], "combine") == 0) {
        struct Address addr2;
        if (isValidAddress(&addr)) {
            if (parseAddressWithoutMask(argv[argc - 1], &addr2)) {
                if (addr.type == addr2.type) {
                    combineAddresses(&addr, &addr2);
                    return makeResult(&addr, argv[2], TRUE);
                }
                else {
                    fprintf(stderr, "addresses to be combined must belong to the same address family\n");
                    return -ERR_INVALID_ADDRESS + 1;
                }
            }
            else {
                return makeResult(&addr2, argv[argc - 1], FALSE);
            }
        }
        else {
            return makeResult(&addr, err, FALSE);
        }
    }

    // from old source:
    if (! strcmp (argv[1], "dnsnet")) {
        if (isValidAddress(&addr)) {
            return (dnsnet (argc, argv));
        }
    }
    return usage(argv[0]);
}