Skip to content

Commit

Permalink
Init commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Otykier committed Sep 5, 2021
0 parents commit 21fee7d
Show file tree
Hide file tree
Showing 86 changed files with 8,681 additions and 0 deletions.
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
###############
# folder #
###############
/**/DROP/
/**/TEMP/
/**/packages/
/**/bin/
/**/csx/
/**/obj/
/**/xdocoutput/
/**/node_modules/
/**/*.sln.ide/
/TestResults/
/.vs/
.NuGet/
artifacts/
target/
/**/_site/
.vscode/
.vs/

###############
# temp file #
###############
*.nupkg
*.log
*.tmp
*.vsprops
*.suo
*.user
*.userprefs
*.sdf
*.sln.ide
*.cache
*.sln.metaproj
.gitattributes
.settings
log.txt
debugSettings.json
launchSettings.json
project.lock.json
*.sublime-workspace
41 changes: 41 additions & 0 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
environment:
op_build_user: "OpenPublishBuild"
op_build_user_email: "vscopbld@microsoft.com"
access_token:
secure: t74btP1uJUIXa65tTiQGWAZvYmJSNjSruJV90exd++sAjrKpo7f6e4LGJJLGIKb3

image: Visual Studio 2017
before_build:
- ps: |
if(-Not $env:APPVEYOR_PULL_REQUEST_TITLE)
{
git checkout $env:APPVEYOR_REPO_BRANCH -q
choco install docfx -y
# choco install nuget.commandline -y
}
build_script:
- msbuild src/SampleClass1/SampleClass1.sln

after_build:
- ps: |
if(-Not $env:APPVEYOR_PULL_REQUEST_TITLE)
{
# & nuget install docfx.console -Version 2.18.4 -Source https://www.myget.org/F/docfx/api/v3/index.json
# & docfx.console.2.18.4\tools\docfx docfx.json
& docfx docfx.json
if ($lastexitcode -ne 0){
throw [System.Exception] "docfx build failed with exit code $lastexitcode."
}
git config --global credential.helper store
Add-Content "$env:USERPROFILE\.git-credentials" "https://$($env:access_token):x-oauth-basic@github.com`n"
git config --global user.email $env:op_build_user_email
git config --global user.name $env:op_build_user
git clone https://github.com/docascode/docfx-seed.git -b gh-pages origin_site -q
Copy-Item origin_site/.git _site -recurse
CD _site
git add -A 2>&1
git commit -m "CI Updates" -q
git push origin gh-pages -q
}
25 changes: 25 additions & 0 deletions docfx.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"metadata": [
],
"build": {
"content": [
{
"files": [ "te3/**/*.md", "te2/**/*.md", "*.md", "toc.yml" ]
}
],
"resource": [
{
"files": [ "images/**", "te3/images/**" ]
}
],
"globalMetadata": {
"_appTitle": "Tabular Editor Documentation",
"_enableSearch": true,
"_appLogoPath": "images/te3-logo-50.svg",
"_appFaviconPath": "images/te3logo.png"
},
"markdownEngineName": "markdig",
"dest": "_site",
"xrefService": [ "https://xref.docs.microsoft.com/query?uid={uid}" ]
}
}
Binary file added images/seed.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/te2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions images/te3-logo-50.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions images/te3-logo-80.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions images/te3-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/te3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/te3logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
67 changes: 67 additions & 0 deletions index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Tabular Editor

Tabular Editor is a tool that lets you easily manipulate and manage measures, calculated columns, display folders, perspectives and translations in Analysis Services Tabular and Power BI Models.

The tool is available in two different versions:

- Tabular Editor 2.x (free, open source) - [GitHub project page](https://github.com/TabularEditor/TabularEditor)
- Tabular Editor 3.x (commercial) - [Home page](https://tabulareditor.com)

## Description
This site contains the documentation for both versions. Select your version in the navigation bar at the top of the screen for product specific documentation.

## Choosing between TE2 and TE3

Tabular Editor 3 is the evolution of Tabular Editor 2. It has been designed for those who seek a "one-tool-to-rule-them-all" solution for Tabular data modeling and development.

### Common features

Both tools provide the same features in terms of which data modeling options are available, by basically exposing every object and property of the [AMO/TOM client library created by Microsoft](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions), in an intuitive and responsive user interface. You can edit advanced object properties that are not available through the standard tools. The tools can load model metadata from files or from any instance of Analysis Services. Changes are only synchronized when you hit Ctrl+S (save) thus providing an "offline" editing experience which most people consider to be superior to the "always synchronized"-mode of the standard tools. This is especially noticable when working on large and complex data models.

In addition, both tools enables making multiple model metadata changes in batches, renaming objects in batches, copy/pasting objects, dragging/dropping objects across tables and display folders, etc. The tools even have undo/redo support.

Both tools feature the Best Practice Analyzer, which continuously scans the model metadata for rules that can define on your own, e.g. to enforce certain naming conventions, make sure non-dimension attribute columns are always hidden, etc.

You can also write and execute C#-style scripts in both tools, for automating repetitive tasks such as generating time-intelligence measures and auto-detecting relationships based on column names.

Lastly, thanks to the "Save-to-folder" functionality, a new file format where every object in the model is saved as an individual file, enables parallel development and version control integration, which is something that is not easy to achieve using only the standard tools.

### Tabular Editor 2.x

Tabular Editor 2.x is a lightweight application for quickly modifying the TOM (Tabular Object Model) of an Analysis Services or Power BI data model. The tool was originally released in 2016 and receives regular updates and bugfixes.

![Tabular Editor 2.x](images/te2.png)

**Tabular Editor 2.x main features:**

- A very lightweight application with a simple and intuitive interface for navigating the TOM
- DAX Dependency View, and keyboard shortcuts for navigating between DAX objects
- Support for editing model perspectives and metadata translations
- Batch renaming
- Search box for quickly navigating large and complex models
- Deployment Wizard
- Best Practice Analyzer
- Advanced Scripting using C#-style scripts for automating repeated tasks
- Command line interface (can be used to integrate Tabular Editor and DevOps pipelines)

### Tabular Editor 3.x

Tabular Editor 3.x is a more advanced application which offers a premium experience with many convenient features to combine all your data modeling and development needs in one single tool.

![Tabular Editor 3.x](images/te3.png)

**Tabular Editor 3.x main features:**

- A highly-customizable and familiar UI
- High-DPI, multi-monitor and theming support (yes, dark mode is available!)
- World class DAX editor with syntax highlighting, semantic checking, auto-complete and much, much more
- Table browser, Pivot Grid browser and DAX Query editor
- Import Table Wizard with support for Power Query data sources
- Data Refresh view allows you to queue and execute refresh operations in the background
- Diagram editor to easily visualize and edit table relationships
- New DAX Scripting capability to edit DAX expressions for multiple objects in a single document
- VertiPaq Analyzer integration

## Conclusion

If you are new to tabular modeling in general, we recommend that you use the standard tools until you familiarize yourself with concepts such as calculated tables, measures, relationships, DAX, etc. At that point, try to give Tabular Editor 2.x a spin, and see how much faster it enables you to achieve certain tasks. If you like it and want more, consider Tabular Editor 3.x!
83 changes: 83 additions & 0 deletions te2/Advanced-Filtering-of-the-Explorer-Tree.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Advanced Object Filtering

This article describes how to use the "Filter" textbox within Tabular Editor - an incredibly useful feature when navigating complex models.

## Filtering Mode
As of [2.7.4](https://github.com/otykier/TabularEditor/releases/tag/2.7.4), Tabular Editor now lets you decide how the filter should apply to objects in the hierarchy, and how search results are displayed. This is controlled using the three right-most toolbar buttons next to the Filter button:

![image](https://user-images.githubusercontent.com/8976200/46567931-08a4b480-c93d-11e8-96fd-e197e87a0587.png)

* ![image](https://user-images.githubusercontent.com/8976200/46567944-44d81500-c93d-11e8-91e2-d9822078dba7.png) **Hierarchical by parent**: The search will apply to _parent_ objects, that is Tables and Display Folders (if those are enabled). All child items will be displayed, when a parent item matches the search criteria.
* ![image](https://user-images.githubusercontent.com/8976200/46567940-2ffb8180-c93d-11e8-9fba-84fbb79b6bb3.png) **Hierarchical by children**: The search will apply to _child_ objects, that is Measures, Columns, Hierarchies, etc. Parent objects will only be displayed if they have at least one child object matching the search criteria.
* ![image](https://user-images.githubusercontent.com/8976200/46567941-37bb2600-c93d-11e8-9c02-86502f41bce8.png) **Flat**: The search will apply to all objects, and results will be displayed in a flat list. Objects that contain child items will still display these in a hierarchical manner.

## Simple search
Type anything into the Filter textbox and hit [Enter] to do a simple case-insensitive search within object names. For example, typing "sales" in the Filter textbox, using the "By Parent" filtering mode, will produce the following results:

![image](https://user-images.githubusercontent.com/8976200/46568002-5f5ebe00-c93e-11e8-997b-7f89dfd92076.png)

Expanding any of the tables will reveal all measures, columns, hierarchies and partitions of the table. If we change the filtering mode to "By Child", the results will look like this:

![image](https://user-images.githubusercontent.com/8976200/46568016-9f25a580-c93e-11e8-9bc2-c0a16a890256.png)

Notice how the "Employee" table now appears in the list, since it has a couple of child items (columns in this case), that contain the word "sales".

## Wildcard search
When typing in a string in the Filter textbox, you can use the wildcard `?` to denote any single character, and `*` to denote any sequence of characters (zero or more). So typing `*sales*` would produce exactly the same results as shown above, however typing `sales*` will only show objects whose name _starts_ with the word "sales" (again, this is case-insensitive).

Searching for `sales*` by parent:

![image](https://user-images.githubusercontent.com/8976200/46568043-19eec080-c93f-11e8-8d81-2a6214bfa572.png)

Searching for `sales*` by child:

![image](https://user-images.githubusercontent.com/8976200/46568117-f9733600-c93f-11e8-96ab-f87769b8097c.png)

Flat search for `sales*` (toggle info columns [Ctrl]+[F1] to show detailed information about each object):

![image](https://user-images.githubusercontent.com/8976200/46568118-042dcb00-c940-11e8-82d1-516207450559.png)

Wildcards can be placed anywhere in the string, and you can include as many as you need. If that's not complex enough, read on...

## Dynamic LINQ search
You can also use [Dynamic LINQ](https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions) to search for objects, which is the same thing you do when creating [Best Practice Analyzer rules](/Best-Practice-Analyzer). To enable Dynamic LINQ mode in the filter box, simply put a `:` (colon) in front of your search string. For example, to view all objects whose name end with "Key" (case-sensitive) write:

```
:Name.EndsWith("Key")
```

...and hit [Enter]. In "Flat" filtering mode, the result looks like this:

![image](https://user-images.githubusercontent.com/8976200/46568130-33dcd300-c940-11e8-903c-193e1acde0ad.png)

For case-insensitive search in Dynamic LINQ, you can either convert the input string using something like:

```
:Name.ToUpper().EndsWith("KEY")
```

or you can supply the [StringComparison](https://docs.microsoft.com/en-us/dotnet/api/system.string.endswith?view=netframework-4.7.2#System_String_EndsWith_System_String_System_StringComparison_) argument, like:

```
:Name.EndsWith("Key", StringComparison.InvariantCultureIgnoreCase)
```

You are not restricted to searching within the names of objects. Dynamic LINQ search strings can be as complex as you like, to evaluate any property (as well as sub-properties) of an object. So if you want to find all objects having an expression that contains the word "TODO", you would use the following search filter:

```
:Expression.ToUpper().Contains("TODO")
```

As another example, the following will display all hidden measures in the model that are not referenced by anything else:

```
:ObjectType="Measure" and (IsHidden or Table.IsHidden) and ReferencedBy.Count=0
````
You can also use Regular Expressions. The following will find all columns whose name contains the word "Number" OR "Amount":
```
:ObjectType="Column" and RegEx.IsMatch(Name,"(Number)|(Amount)")
```
Note, that the display options (the toolbar buttons directly above the tree), may affect the results when using "By Parent" and "By Child" filtering mode. For example, the above LINQ filter only returns columns, but if your display options are currently set to not show columns, nothing will be displayed.
Loading

0 comments on commit 21fee7d

Please sign in to comment.