Navigation Menu

Skip to content

Commit

Permalink
Detect domain id given as a part of host name or path
Browse files Browse the repository at this point in the history
  • Loading branch information
piro committed Aug 1, 2012
1 parent 479a3f9 commit 00b0600
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 50 deletions.
65 changes: 44 additions & 21 deletions lib/database/domain.js
Expand Up @@ -56,47 +56,69 @@ function Domain() {
}
Domain.prototype = {
initialize: function(source, context) {
this.context = context && new nroonga.Context(context);
this.name = this.getName(source);
this.cachedIndexFields = {};

this.context = context && new nroonga.Context(context);
this.initializeNameAndId(source);

// for validation
this.tableName;
this.termsTableName;
},
getName: function(source) {
if (typeof source == 'string')
return source;
initializeNameAndId: function(source) {
if (typeof source == 'string') {
this.name = source;
return;
}

if (source.query && source.query.DomainName)
return source.query.DomainName;
if (source.query && source.query.DomainName) {
this.name = source.query.DomainName;
this.id = this.getIdFromTable(this.toTableNamePart(this.name));
return;
}

if (source.headers && source.headers.host) {
var host = source.headers.host;
var domainNameFromHost = Domain.getNameFromHost(host);
if (domainNameFromHost)
return domainNameFromHost;
var nameAndIdFromHost = Domain.getNameAndIdFromHost(host);
if (nameAndIdFromHost.name) {
this.name = nameAndIdFromHost.name;
this.id = nameAndIdFromHost.id;
return;
}
}

if (source.url) {
var domainNameFromPath = Domain.getNameFromPath(source.url);
if (domainNameFromPath)
return domainNameFromPath;
var nameAndIdFromPath = Domain.getNameAndIdFromPath(source.url);
if (nameAndIdFromPath.name) {
this.name = nameAndIdFromPath.name;
this.id = nameAndIdFromPath.id;
return;
}
}

throw new Error('no domain name');
},
getIdFromTable: function(tableName) {
return this.id;
},

get tableName() {
if (!this._tableName) {
assertValidDomainName(this.name);
this._tableName = this.name + '_' + this.id;
this._tableName = this.toTableNamePart(this.name) + '_' + this.id;
}
return this._tableName;
},
toTableNamePart: function(string) {
return string;
},

get termsTableName() {
if (!this._termsTableName)
this._termsTableName = this.tableName + '_BigramTerms';
return this._termsTableName;
},

getIndexField: function(field) {
return this.cachedIndexFields[field] ||
(this.cachedIndexFields[field] = new IndexField(field, this));
Expand All @@ -115,6 +137,7 @@ Domain.prototype = {
}, this);
return fields;
},

get synonymTableName() {
if (!this._synonymTableName)
this._synonymTableName = this.tableName + '_synonyms';
Expand Down Expand Up @@ -230,21 +253,21 @@ Domain.prototype = {

exports.Domain = Domain;

Domain.getNameFromHost = function(host) {
Domain.getNameAndIdFromHost = function(host) {
var domainMatcher = /^(?:doc|search)-([^\.]+)-([^\.\-]+)\./;
var match = host.match(domainMatcher);
if (match)
return match[1];
return{ name: match[1], id: match[2] };

return '';
return { name: '', id: '' };
};

Domain.getNameFromPath = function(path) {
var domainMatcher = /^\/gcs\/([^\/]+)/;
Domain.getNameAndIdFromPath = function(path) {
var domainMatcher = /^\/gcs\/([^\/]+)-([^\/\-]+)/;

var match = path.match(domainMatcher);
if (match)
return match[1];
return{ name: match[1], id: match[2] };

return '';
return { name: '', id: '' };
};
61 changes: 32 additions & 29 deletions test/database-domain.test.js
Expand Up @@ -82,61 +82,61 @@ suite('database', function() {
});
});

suite('getNameFromHost', function() {
suite('getNameAndIdFromHost', function() {
test('valid, doc, lower case and number', function() {
var host = 'doc-test0123-id0123.example.com';
var name = Domain.getNameFromHost(host);
assert.equal(name, 'test0123');
var nameAndId = Domain.getNameAndIdFromHost(host);
assert.deepEqual(nameAndId, { name: 'test0123', id: 'id0123' });
});

test('valid, search, lower case and number', function() {
var host = 'search-test0123-id0123.example.com';
var name = Domain.getNameFromHost(host);
assert.equal(name, 'test0123');
var nameAndId = Domain.getNameAndIdFromHost(host);
assert.deepEqual(nameAndId, { name: 'test0123', id: 'id0123' });
});

test('valid, doc, lower case, hyphen and number', function() {
var host = 'doc-test-0123-id0123.example.com';
var name = Domain.getNameFromHost(host);
assert.equal(name, 'test-0123');
var nameAndId = Domain.getNameAndIdFromHost(host);
assert.deepEqual(nameAndId, { name: 'test-0123', id: 'id0123' });
});

test('valid, search, lower case, hyphen and number', function() {
var host = 'search-test-0123-id0123.example.com';
var name = Domain.getNameFromHost(host);
assert.equal(name, 'test-0123');
var nameAndId = Domain.getNameAndIdFromHost(host);
assert.deepEqual(nameAndId, { name: 'test-0123', id: 'id0123' });
});

test('valid, search, lower case, hyphen and number, deep subdomain including region identifier', function() {
var host = 'search-test-0123-id0123.us-east-1.example.com';
var name = Domain.getNameFromHost(host);
assert.equal(name, 'test-0123');
var nameAndId = Domain.getNameAndIdFromHost(host);
assert.deepEqual(nameAndId, { name: 'test-0123', id: 'id0123' });
});

test('invalid', function() {
var host = 'cloudsearch.example.com';
var name = Domain.getNameFromHost(host);
assert.equal(name, '');
var nameAndId = Domain.getNameAndIdFromHost(host);
assert.deepEqual(nameAndId, { name: '', id: '' });
});
});

suite('getNameFromPath', function() {
suite('getNameAndIdFromPath', function() {
test('valid, lower case and number', function() {
var path = '/gcs/test0123/';
var name = Domain.getNameFromPath(path);
assert.equal(name, 'test0123');
var path = '/gcs/test0123-id0123/';
var nameAndId = Domain.getNameAndIdFromPath(path);
assert.deepEqual(nameAndId, { name: 'test0123', id: 'id0123' });
});

test('valid, lower case, hyphen and number', function() {
var path = '/gcs/test-0123/';
var name = Domain.getNameFromPath(path);
assert.equal(name, 'test-0123');
var path = '/gcs/test-0123-id0123/';
var nameAndId = Domain.getNameAndIdFromPath(path);
assert.deepEqual(nameAndId, { name: 'test-0123', id: 'id0123' });
});

test('invalid', function() {
var path = '/gcs';
var name = Domain.getNameFromPath(path);
assert.equal(name, '');
var nameAndId = Domain.getNameAndIdFromPath(path);
assert.deepEqual(nameAndId, { name: '', id: '' });
});
});

Expand All @@ -145,7 +145,8 @@ suite('database', function() {
var host = 'doc-test0123-id0123.example.com';
var request = { headers: { host: host } };
var domain = new Domain(request);
assert.equal(domain.name, 'test0123');
assert.deepEqual({ name: domain.name, id: domain.id },
{ name: 'test0123', id: 'id0123' });
});

test('from host, invalid', function() {
Expand All @@ -159,32 +160,34 @@ suite('database', function() {
test('from path, valid', function() {
var host = 'example.com';
var request = { headers: { host: host },
url: '/gcs/test0123' };
url: '/gcs/test0123-id0123' };
var domain = new Domain(request);
assert.equal(domain.name, 'test0123');
assert.deepEqual({ name: domain.name, id: domain.id },
{ name: 'test0123', id: 'id0123' });
});

test('from path, invalid', function() {
assert.throw(function() {
var host = 'example.com';
var request = { headers: { host: host },
url: '/gcs/test_01234' };
url: '/gcs/test_0123-id0123' };
var domain = new Domain(request);
}, /cannot appear in a domain name/);
});

test('host vs path', function() {
var host = 'doc-test0123-id0123.example.com';
var request = { headers: { host: host },
url: '/gcs/test4567' };
url: '/gcs/test4567-id4567' };
var domain = new Domain(request);
assert.equal(domain.name, 'test0123');
assert.deepEqual({ name: domain.name, id: domain.id },
{ name: 'test0123', id: 'id0123' });
});

test('option vs host vs path', function() {
var host = 'doc-test0123-id0123.example.com';
var request = { headers: { host: host },
url: '/gcs/test4567',
url: '/gcs/test4567-id4567',
query: { DomainName: 'test890' } };
var domain = new Domain(request);
assert.equal(domain.name, 'test890');
Expand Down

0 comments on commit 00b0600

Please sign in to comment.