You are currently browsing legacy 3.0 version of documentation. Click here to switch to the newest 4.2 version.

We can help you with migration to the latest RavenDB

Contact Us Now
see on GitHub

Plugins: Compilation Extensions

In certain situations users may want to use more complex logic to calculate a value of an index entry field. To do this we have introduced an AbstractDynamicCompilationExtensionto RavenDB.

public abstract class AbstractDynamicCompilationExtension
{
	public abstract string[] GetNamespacesToImport();

	public abstract string[] GetAssembliesToReference();
}

where:
* GetNamespacesToImport returns a list of namespaces that RavenDB will have to import
* GetAssembliesToReference returns a list of full paths to assemblies

Example - Check if a given word is a palindrome

public static class Palindrome
{
	public static bool IsPalindrome(string word)
	{
		if (string.IsNullOrEmpty(word))
			return true;

		int min = 0;
		int max = word.Length - 1;
		while (true)
		{
			if (min > max)
				return true;

			char a = word[min];
			char b = word[max];
			if (char.ToLower(a) != char.ToLower(b))
				return false;

			min++;
			max--;
		}
	}
}

public class PalindromeDynamicCompilationExtension : AbstractDynamicCompilationExtension
{
	public override string[] GetNamespacesToImport()
	{
		return new[]
			{
				typeof (Palindrome).Namespace
			};
	}

	public override string[] GetAssembliesToReference()
	{
		return new[]
			{
				typeof (Palindrome).Assembly.Location
			};
	}
}

Now we can use our Palindrome in our index definition.

store.DatabaseCommands.PutIndex("Dictionary/Palindromes", new IndexDefinition
{
	Map = @"from word in docs.Words 
				select new 
				{ 
							Word = word.Value, 
							IsPalindrome = Palindrome.IsPalindrome(word.Value) 
				}"
});